StaggeredGridLayoutManager переупорядочивает элементы без учета определенных полей - PullRequest
0 голосов
/ 15 января 2020

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-й столбец, снова он не обновляет свои поля. как решить это неправильное поведение ?! before reorderingafter reordering

1 Ответ

0 голосов
/ 16 января 2020

следующее решение сработало как шарм!

        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();
        }
}
...