RecyclerView 瀑布流使用總結
阿新 • • 發佈:2018-11-27
目錄
遇到的問題
- item亂跳,頂部留白,滑動卡頓
- item設定間距
解決辦法
問題1
關鍵在於知道圖片的原始寬高,然後根據圖片的原始寬高比動態的設定item的高度。
圖片的原始寬高可以由後臺返回,也可以自己獲取,最方便的就是介面返回了。
自己獲取可以通過glide提供的API來實現,如下
GlideApp.with(context) .asBitmap() .load(url) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) { //圖片的原始寬高 int width = bitmap.getWidth(); int height = bitmap.getHeight(); } });
動態設定item的高度,如下
ImageView imageView = viewHolder.getView(R.id.iv_item_list); ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams(); int itemWidth = (ScreenUtils.getScreenWidth(mContext) - 10 * 4) / 2; float scale = ((float) itemWidth) / item.getWidth(); int itemHeight = (int) (item.getHeight() * scale); layoutParams.width = itemWidth; layoutParams.height = itemHeight; imageView.setLayoutParams(layoutParams);
問題2
通過
addItemDecoration(new SpaceItemDecoration(getContext(), 10))
設定item之間的間距,提過一個樣例,如下
public class SpaceItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpaceItemDecoration(Context context, int space) { this.space = dip2px(context, space); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); outRect.left = space; outRect.right = space; outRect.bottom = space; if (position == 0 || position == 1) { outRect.top = space; } } private int dip2px(Context context, float dpValue) { float density = context.getResources().getDisplayMetrics().density; return (int) (dpValue * density + 0.5f); } }