Android RecycleView瀑布流的间隔问题

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;

    }

}

你可能感兴趣的:(Android RecycleView瀑布流的间隔问题)