小技巧 1:可通过键盘方向键或字母键 awsd、nl 快速查看前后项目哦 SuitedRecyclerView简介:一个根据自身大小自适应的 RecyclerView,自定义了 LayoutManager 最基本的用法RecyclerView 的设置 mPhotosAdapter = new PhotosAdapter(list, this);
recyclerView.setAdapter(mPhotosAdapter);
//自定义 LayoutManager
SuitedLayoutManager layoutManager = new SuitedLayoutManager(mPhotosAdapter);
recyclerView.setLayoutManager(layoutManager);
//设置最大的图片显示高度,默认为 600px
layoutManager.setMaxRowHeight(getResources().getDisplayMetrics().heightPixels / 3);
//设置 Item 之间的空隙
recyclerView.addItemDecoration(new SuitedItemDecoration(DisplayUtils.dpToPx(4.0f, this)));
PhotosAdapter 需要实现 SizeCaculator.SizeCalculatorDelegate 接口里的 aspectRatioForIndex(int position)方法,返回图片宽高比
@Override
public double aspectRatioForIndex(int position) {
if (position < getItemCount()) {
PhotoInfo info = mPhotos.get(position);
//如果你的图片 url 是以 _w750_h750.jpg 这样的格式结尾,可以用 SuitUrlUtil 这个工具类获取它的宽高比
double ratio = SuitUrlUtil.getAspectRadioFromUrl(info.photo);
return ratio;
}
return 1.0;
}
内存的优化使用由于这个 LayoutManager 会根据自身宽高和相邻图片宽高的比率最后计算出每张图片的大小,所以每张图片大小几乎都不一样,recyclerView 里 View 的复用情况很少,这种情况下如果不对图片进行等比缩小和对滑动做优化,将会造成严重的卡顿。 在我个人实践的过程中呢,有两处优化的点可以让图片滑动时更为流畅。 在 ImageView 确定 Width 和 Height 后,再进行网络请求,具体可参考 library 里的 SuitImageView 的做法 @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if(w != 0 && h != 0) {
Picasso.with(getContext()).load(mPhoto).tag(getContext()).resize(w,h).into(this);
}
滑动过程中,中断图片请求,以使用 Picasso 框架请求图片为例: recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
Picasso.with(PhotoActivity.this).resumeTag(PhotoActivity.this);
} else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
Picasso.with(PhotoActivity.this).pauseTag(PhotoActivity.this);
} else if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
Picasso.with(PhotoActivity.this).pauseTag(PhotoActivity.this);
}
}
});
Demo 的滑动效果下拉刷新上拉加载更多框架修改自WaveSwipeRefreshLayout开源库 License Apache 2.0
|