Recyclerview onBindViewHolder вызывается для всех элементов внутри LinearLayout с весами

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

My Layout содержит 2 повторных просмотра, разделенных на 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.

Работает нормально, если убраны веса, но требуется наличие двух recylcerviews бок о бок.

Как я могу сказать, что recyclerview перезаписывает представления вместо загрузки всех?

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

3 ответа

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

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

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

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

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

андроид:layout_width="0dp"

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

Другие вопросы по тегам