Подтвердить что ты не робот

Recyclerview onBindViewHolder вызвал все элементы, когда внутри LinearLayout с весами

Недавно я обновил из библиотеки поддержки recyclerview-v7: 23.1.1 для recyclerview-v7: 25.1.0.

My Layout содержит 2 recylerviews, разделенных на 50% на экране. Код xml выглядит следующим образом:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView1"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scrollbars="none"/>

    <android.support.v4.widget.Space
        android:layout_width="@dimen/two_dp"
        android:layout_height="match_parent"
        android:background="@color/dark_gray"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView2"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scrollbars="none"/>

</LinearLayout>

Теперь onBindViewHolder вызывается для всех элементов списка, а не только для видимых элементов. Это началось после обновления, чтобы поддерживать библиотеку 25.1.0.

Он отлично работает, если веса удалены, но требуется 2 повторных сеанса.

Как сообщить recyclerview для повторного использования представлений вместо загрузки всех?

ОБНОВЛЕНИЕ: он отлично работает на устройствах Marshmallow и выше. Проблема присутствует в Lollipop или ниже. Здесь вы можете найти демонстрационный проект: https://bitbucket.org/aniketit/recyclerviewtest

4b9b3361

Ответ 1

Я столкнулся с той же проблемой, которая сохранялась после удаления взвешенных и 0dp элементов. В моем случае проблема была довольно тривиальной - я случайно поместил свой RecyclerView внутри NestedScrollView с fillViewPort = true. Это приведет к тому, что адаптер будет создавать все элементы для представления, и вы заметите значительную задержку в реагировании.

Оказывается, проблема будет возникать, если вы просто используете RecyclerView в обычном старом ScrollView.

Ответ 2

У меня была такая же проблема. RecyclerView был хорошо утилизирован в Marshmallow, но не раньше.

Моя ошибка заключалась в том, чтобы перевести RecyclerView в ScrollView. Вы должны проверить, есть ли у вас scrollview, если да, удалите его, и ваша проблема будет решена для устройств с предварительным зефиром.

Ответ 3

В библиотеках > 23.1.1 вы можете удалить

Android: layout_width = "0dp"

удалите его, и все работает отлично.