Android StaggedGridLayoutManager在不考虑已定义边距的情况下重新排序项目
I',对我的Android StaggedGridLayoutManager在不考虑已定义边距的情况下重新排序项目,android,android-layout,android-recyclerview,staggeredgridlayoutmanager,Android,Android Layout,Android Recyclerview,Staggeredgridlayoutmanager,I',对我的RecyclerView使用StaggedGridLayoutManager,以便在两列中显示宽度相同但高度不同的项目。由于我希望项目之间的间距相等,因此使用了以下ItemDecoration: public class ImageCardDecoration extends RecyclerView.ItemDecoration { private int margin; public ImageCardDecoration(Context context) {
RecyclerView
使用StaggedGridLayoutManager
,以便在两列中显示宽度相同但高度不同的项目。由于我希望项目之间的间距相等,因此使用了以下ItemDecoration
:
public class ImageCardDecoration extends RecyclerView.ItemDecoration {
private int margin;
public ImageCardDecoration(Context context) {
margin = 5;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position = parent.getChildAdapterPosition(view);
int spanIndex =((StaggeredGridLayoutManager.LayoutParams)view.getLayoutParams()).getSpanIndex();
if (spanIndex == 0) {
outRect.left = 2 * margin;
outRect.right = margin;
} else {
outRect.left = margin;
outRect.right = 2 * margin;
}
outRect.top = 2 * margin;
if (position == 0 || position == 1)
outRect.top = 14 * margin;
}
}
而且效果很好。但是在滚动recyclerview之后,当它空闲时,布局管理器会重新排序一些项目以填补空白(这很好,我希望这样做),但是如果项目从第2列移动到第1列,它不会使用上面代码中为第1列定义的边距,并且如果项目从第1列移动到第2列,同样,它不会更新其边距。如何解决这种不良行为?!
以下解决方案非常有效
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE)
recyclerView.invalidateItemDecorations();
}
}