SuitedRecyclerView
Introduction: 一个根据自身大小自适应的 RecyclerView,自定义了 LayoutManager
Tags:

最基本的用法
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开源库
