RecyclerView с reverseLayout переходит на notifyDataSetChanged

Я установил layoutManager моего recyclerView следующим образом:

recyclerView.layoutManager = LinearLayoutManager(context, HORIZONTAL, true)

Последний параметр устанавливает reverseLayout в true, что означает, что он будет загружаться справа налево. Мне это нужно, потому что я реализую своего рода календарь, в котором последняя дата является текущей датой, но вы можете бесконечно прокручивать прошлое.

Проблема в том, что когда в моем адаптере я вызываю notifyItemChanged или notifyDataSetChanged, список прокручивается на несколько пикселей вправо. Этого не происходит с reverseLayout=false.

Это также происходит только тогда, когда размер RecyclerView равен MATCH_PARENT, когда я вручную устанавливаю любое значение dp, проблема исчезает.

Есть идеи, что происходит и как с этим справиться?


person Michał Klimczak    schedule 05.12.2017    source источник
comment
На данный момент я просто устанавливаю размер recyclerView вручную, и это работает как обходной путь, но было бы здорово исправить это должным образом.   -  person Michał Klimczak    schedule 05.12.2017


Ответы (2)


Может быть, уже слишком поздно, но в любом случае, я оставлю это здесь. Использование макета ограничений с ограничениями совпадения в recyclerview (0dp с горизонтальными ограничениями) решило проблему для меня.

person barotia    schedule 25.04.2019
comment
0dp у меня не работает. MATCH_PARENT на самом деле исправляет это, но я хочу, чтобы это было между двумя представлениями WRAP_CONTENT, поэтому я не могу это использовать. - person Chirag Kalra; 24.09.2020

Установка размеров RecyclerView программно сработала для меня.

В Котлине -

constraintLayout.doOnLayout {
    recyclerview.layoutParams.height = bottomLayout.top - appBarLayout.bottom
}

XML -

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bottomLayout" />

Там, где я хочу, чтобы recyclerView находился между bottomLayout и appBarLayout, а limitedLayout — это корневой макет.

person Chirag Kalra    schedule 24.09.2020