StaggeredGridLayoutManager的坑

效果图

最近使用StaggeredGridLayoutManager+Rececleview实现瀑布流,出现了一系列的问题:出现空白、item位置错位、刷新加载时图片宽高会重新绘制、页面跳动等问题。

网上各路大神给出了很多解决办法,因为图片的高度是不一致的,所以就有点难搞,

防止位置交换网上的办法很多也好使,下面贴代码:

layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
//防止item 交换位置
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        layoutManager.invalidateSpanAssignments(); //防止第一行到顶部有空白区域
    }
});


//其中
  layoutManager =new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
                      

那么高度在刷新加载时,因为Recycleview的item复用问题,复用的话因为每个item的高度是不一致的,会造成图片的高度不一,下面解决办法是:

思路就是在第一次用glide 拿到图片之后,就取bitmap的宽高,然后  按照宽高比获取图片高度,因为图片宽度是定死的

我这个2列的瀑布流, 宽度就取屏幕一半.  然后  这个宽高 同时去改变  imageview的宽高和bitmap的宽高.这样就能保证图片不变形,而且,每次下拉刷新的时候都不会改变其大小.

   RequestOptions requestOptions;
                requestOptions = new RequestOptions()
                        .fitCenter()
                        .error(R.drawable.accountdefault)
                        .skipMemoryCache(false)
                        .diskCacheStrategy(DiskCacheStrategy.RESOURCE);

            Glide.with(getActivity())
                    .asBitmap()
                    .load(data2.getZipObjUrl())
                    .apply(requestOptions)
                    .into(new SimpleTarget<Bitmap>() {
                   public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) {
                       //这个bitmap就是你图片url加载得到的结果
//                            //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。
                       ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams) viewHolder.ivBg.getLayoutParams();//获取你要填充图片的布局的layoutParam
                            layoutParams.height = (int) (((float) bitmap.getHeight()) / bitmap.getWidth() *  BottomStatusUtils.getScreenWidth(getActivity()) / 2 );
                            //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半
                            layoutParams.width =  BottomStatusUtils.getScreenWidth(getActivity()) / 2;//这个是布局的宽度
                            viewHolder.ivBg.setLayoutParams(layoutParams);//容器的宽高设置好了
                            // 然后在改变一下bitmap的宽高
                            viewHolder.ivBg.setImageBitmap(bitmap);
                        }


                    });




    //获取屏幕宽度的方法
    public static int getScreenWidth(Context context)
    {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.widthPixels;
    }

参考

https://blog.csdn.net/qq_2430192765/article/details/78767369

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值