RecyclerView下拉刷新item间距变大的问题

RecyclerView下拉刷新item间距变大的问题

现在列表类布局是非常常见的布局,大多数都是使用RecyclerView来实现。日前在项目中就有一个页面是列表类的,稍微有些不同的是单个item中需要显示图片,类似朋友圈那样的,这样就嵌套了一个RecyclerView,效果见下图:
这里写图片描述
相关代码如下:

  @Override
    public void onBindViewHolder(CommonViewHolder viewHolder, int i) {
          //图片使用的RecyclerView 
          RecyclerView recyclerView = viewHolder.getView(R.id.recyclerview);
           recyclerView.setVisibility(View.VISIBLE);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(recyclerView.getContext(), 3);
        recyclerView.setLayoutManager(gridLayoutManager);
        GridItemDecoration gridItemDecoration = new GridItemDecoration(3, DensityUtil.dip2px(3));

            recyclerView.addItemDecoration(gridItemDecoration);

        recyclerView.setAdapter(new PostListImagesAdapter(data.getPost_pic_url()));
        recyclerView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_UP:
                        ContentStartAcHelper.startPostDetailAc(v.getContext(), String.valueOf(data.getPost_id()), data.getPost_type(), false);
                        break;
                }
                return false;
            }
        });
    }

这时在下拉刷新时就会发现,图片间的间距每次都会变大,分析上面的代码,大概可猜测到 是recyclerView.addItemDecoration(gridItemDecoration)的问题,在下拉刷新或者上下滑动后,调用onBindViewHolder方法,导致每次都会执行recyclerView.addItemDecoration(gridItemDecoration),点击方法进入源码都发现,此方法会将每次add的Decoration累加起来:

   public void addItemDecoration(ItemDecoration decor) {
        addItemDecoration(decor, -1);
    }

       public void addItemDecoration(ItemDecoration decor, int index) {
        if (mLayout != null) {
            mLayout.assertNotInLayoutOrScroll("Cannot add item decoration during a scroll  or"
                    + " layout");
        }
        if (mItemDecorations.isEmpty()) {
            setWillNotDraw(false);
        }
        if (index < 0) {
            mItemDecorations.add(decor);
        } else {
            mItemDecorations.add(index, decor);
        }
        markItemDecorInsetsDirty();
        requestLayout();
    }

找到问题所在,那么就好解决了,只要在recyclerView.addItemDecoration时增加判断是否已经有ItemDecoration即可:

   if (recyclerView.getItemDecorationCount() == 0 ) {
            recyclerView.addItemDecoration(gridItemDecoration);
        }

问题结局!
另外,图片Recyclerview使用的是GridLayoutManager,在图片空白的位置点击是没有效果的,可通过设置setOnTouchListener来实现点击效果,代码见上。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值