Wir haben eine NestedScrollView, die zwei verschiedene RecyclerView
beide mit vertikalen Scroll arbeiten enthält. Das Scroll-Layout liegt innerhalb SwipeRefreshLayout
.RecyclerView notifyDataSetChanged() friert UI ohne ANR
Upd: Wir wissen über getItemViewType(pos)
Methode und verwenden Sie es an anderen Orten. Aber hier haben wir komplexe Logik, die weiter in 2 verschiedene Bildschirme unterteilt wird, daher haben wir zwei separate Präsentatoren für jeden von RecyclerView und kombinieren sie zu einem und die Trennung in einem Monat ist keine Option.
Von einem Moment an bemerkten wir, dass das Aktualisieren des Bildschirms mit Wischen zum Aktualisieren die Benutzeroberfläche einfriert: übersprungene Frames in Protokollen, Unmöglichkeit, Operationen mit UI durchzuführen, Fortschrittsbalken einzufrieren. Es dauert bis zu fünf Sekunden, aber wir bekommen keine ANR. Es funktioniert am Anfang gut und friert am Ende ein. Wenn wir notifyDataSetChanged()
im Adapter entfernen, sieht alles gut aus.
Wir haben versucht, eine der Recycler-Ansichten zu entfernen, um alle Operationen aus ViewHolder.onCreate()
und onBindViewHolder()
zu entfernen, aber es hat nicht geholfen. Außerdem haben wir überprüft, ob die Probleme durch eine Datenverarbeitung entstehen (wir verwenden RxJava 2, um das Threading zu manipulieren) und wir sehen, dass alle Operationen mit Netzwerk-, Datenbank- und Datenverarbeitung in Nicht-UI-Threads durchgeführt werden und bereits fertig sind wenn die Verzögerung beginnt. Hier
ist das Layout:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height=«match_parent"
android:orientation="vertical"
>
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content»
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation=«vertical"
android:paddingBottom="@dimen/spacing_bigger»>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_chats"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white_bg"
/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycle_friends"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white_bg"
/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Ändern von NestedScrollView's layout_height zu "match_parent" behebt das Problem nicht – Thinsky
Dies ist als akzeptierte Lösung markiert, aber nicht für mich –