I ', используя StaggeredGridLayoutManager
для моего RecyclerView
, чтобы показать элементы в 2 столбцах одинаковой ширины, но разной высоты. так как я хочу равный промежуток между элементами, используется следующее 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;
}
}
, и оно отлично работает. но после прокрутки окна повторного просмотра и когда он получает Idle
, менеджер компоновки переупорядочивает некоторые элементы, чтобы заполнить пробелы (это хорошо, я хочу это поведение), но если элемент перемещается из 2-го столбца в 1-й столбец, он не ' • использовать поля, определенные для 1-го столбца в приведенном выше коде, а также, если элемент перемещается из 1-го столбца во 2-й столбец, снова он не обновляет свои поля. как решить это неправильное поведение ?!