1. 程式人生 > >RecyclerView 瀑布流使用總結

RecyclerView 瀑布流使用總結

目錄

 

遇到的問題

解決辦法


遇到的問題

  1. item亂跳,頂部留白,滑動卡頓
  2. 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);
    }
}