RecyclerView的StaggeredGridLayoutManger瀑布流的问题

1.StaggeredGridLayoutManger模式设置Item间隔的问题

staggeredGridLayoutManager不可以使用position去设置间隔,因为瀑布流是从左到右,从上到下排列的,无法根据position去定位item的左右位置,解决办法是使用StaggeredGridLayoutManager内部类LayoutParams下面的mSpan.mIndex值。不过没有查到这个值得作用,有大佬知道的可以说一下(o)。以下是定义的一个SpaceItemDecoration类:

public class SpaceItemDecoration extends RecyclerView.ItemDecoration {

    /**
     * 列数
     */
    private int mSpanCount;
    /**
     * 间距
     */
    private int mSpace;

    public SpaceItemDecoration(int spanCount, int space) {
        this.mSpanCount = spanCount;
        this.mSpace = SizeUtils.dp2px(space);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int position = parent.getChildAdapterPosition(view);
        int spanIndex = ((StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex();
        if (position == 0 || position == 1) {
            outRect.top = mSpace;
        }
        outRect.bottom = mSpace;
        if (spanIndex == 0) {
            outRect.left = mSpace;
            outRect.right = mSpace / 2;
        } else {
            outRect.left = mSpace / 2;
            outRect.right = mSpace;
        }
    }
}

2.Item位置跳动,顶部留白

使用staggeredGridLayoutManager时,向下滑动加载更多后再回到顶部出现顶部的两个Item互换位置,间隔增大,第一个Item有时出现留白。可能是因为加载更多后使用notifyDataSetChanged()刷新视图时重新计算了Item的高度造成的,在网上查到的一些方法都尝试了并没有解决问题,之后在郭霖大佬的开源项目中找到了一行代码解决了。

layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
recyclerView.setHasFixedSize(true);

// 加载更多刷新使用以下方法,size就是集合的大小,mList.size();
mAdapter.notifyItemInserted(size);

你可能感兴趣的:(RecyclerView的StaggeredGridLayoutManger瀑布流的问题)