RecycleView瀑布流的间隔问题
//设置recycleview瀑布流方式
recycleview.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
//设置瀑布流间隔
recycleview.addItemDecoration(new StaggeredDividerItemDecoration(mActivity, (int) getResources().getDimension(R.dimen.dp_9)));
//就是这个间隔,瀑布流的间隔其他方式的间隔不一样,比较风骚,下面这段借鉴(我啊翔1314)的内容。
下一个item的位置取决于上一个item的那个更短一点,就放那个下面,如上图所示。
这是因为瀑布流的item不是根据下标的顺序去排列,而是根据上方的两个item的高度差确定位置。上方哪个item预留的空间比较高,就会排列到这个item的下方。
解决办法:
自定义ItemDecoration extends RecyclerView.ItemDecoration
代码示例:
public class StaggeredDividerItemDecorationextends RecyclerView.ItemDecoration {
private Contextcontext;
private int space;
public StaggeredDividerItemDecoration(Context context, int space) {
this.context = context;
this.space = space;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
// 特别注意此处,获取item在span中的下标,不能用intposition=parent.getChildAdapterPosition(view);这样拿到的可能是正确顺序的下标,因为如上图所示,顺序不规律,设置居左居右边距就可能紊乱。
int spanIndex = params.getSpanIndex();//这才是真正的视图可见的第几个顺序的下标,不过不是列表对应的索引,只是视觉位置索引。
// 下面是中间间隔设置,
if (spanIndex %2 ==0) {
outRect.left =0;
}else {
// item为奇数位,设置其左间隔为5dp
outRect.left =space;
}
// 下方间隔
outRect.bottom =space;
}
}
网友评论