Recyclerview竖直瀑布流之间距均等问题,头部无左右间距

瀑布流的position是根据列的高度哪个小而来加载下一个position在哪里, 
上面瀑布流图我们可以看到,左0,右1 之后,2到右边了,那是因为 
第二列的高度小于第一列的高度,所以就加载到第二列,以此类推, 
下面的高度可以说就是随机展示的,谁也不知道接下来要怎么判断分割线, 
我们可以通过StaggeredGridLayoutManager.LayoutParams 
里的getSpanIndex()来判断,这个方法不管你高度怎样, 
他都是左右左右开始排列的,楼主是两列的就设置了如下代码。
 StaggeredGridLayoutManager.LayoutParams params =
    (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
        /**
         * 根据params.getSpanIndex()来判断左右边确定分割线
         * 第一列设置左边距为space,右边距为space/2  (第二列相反)
         */
        if (params.getSpanIndex() % 2 == 0) {
            outRect.left = space;
            outRect.right = space / 2;
        } else {
            outRect.left = space / 2;
            outRect.right = space;
        }
我的头部是宽度是屏幕宽度 就偷懒通过 parent.getChildAdapterPosition(view) == 0 单独拿出来设置了
设置后发现问题,刚开始展示的时候是没有问题的,但是滑动之后 滑回来的时候因为瀑布流要保证每次都填充满屏幕,这样的机制
导致了item会发生一定的变化,试着锁定item的位置。通过recycleView.addOnScrollListener的 onScrollStateChanged()方法中调用了staggeredGridLayoutManagerlayoutManager.invalidateSpanAssignments()。
然而还是无法显示item移动问题。 然后又采用记录设置item大小的方法
定义一个HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用来保存已显示过的ImageView尺寸,显示时直接取其比例即可


代码:onBindItemView(),调用resizeItemView(itemViewHolder.frontCoverImage, getScaleType(position));
然而还是没有效果
继续调整l StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);  
        //RecyclerView滑动过程中不断请求layout的Request,不断调整item见的间隙,并且是在item尺寸显示前预处理,因此解决RecyclerView滑动到顶部时仍会出现移动问题  
        layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);  
        mRecyclerView.setLayoutManager(layoutManager);  
        mRecyclerView.addItemDecoration(new DividerGridItemDecoration(getContext()));  
        mRecyclerView.setPadding(0, 0, 0, 0);  
        mRecyclerView.addOnScrollListener(new OnScrollListener() {  
            @Override  
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
                super.onScrollStateChanged(recyclerView, newState);  
                layoutManager.invalidateSpanAssignments();  
            }  
        });  
然而还是无法解决,这时候转换思路, 演化了整个复用过程中的item变化,发现item是在设置间距之后进行item移动的,
这才是问题的致命所在,item设置间距之后,因为有上下间距的存在,会对瀑布流的排列造成一点的影响,所以会在间距设置之后
才进行整个界面的填充,然后如何处理这个问题呢。
经过本人实验,可行,可以刨除item移动带来的影响。
第一次的间距是对的说明 * 根据params.getSpanIndex()来判断左右边确定分割线 是可行的。然后通过监听recycleview的滑动去实时改变间距,
也就是刷新 recyclerView.invalidateItemDecorations();
至此这个问题终于解决了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值