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);