瀑布流的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,右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();
至此这个问题终于解决了。