Recyclerview scrollen nach oben nach dem Aufruf notifydatasetchanged
Habe ich eine horizontale recyclerview (mit einem LinearLayoutManager) und es ' s child-Element hat eine Bildansicht verpackt in einem relativelayout. Die recyclerview hat drei horizontale Zeilen, die untergeordnete Elemente. Wenn die recyclerview gescrollt ist, ich aktualisiere den Datensatz mit der Antwort von einem http-Aufruf und Aufruf notifydatasetChanged in der http-Antwort-Rückruf. Wenn die recyclerview Kind-Element Höhe und Breite sind Feste Werte (ZB. 150dp, 84dp) die recyclerview verhält sich wie vorgesehen, D. H., lädt die neuen Elemente und bleibt an der gleichen scroll-position aber wenn ich die Höhe und Breite der recyclerview Kind-Element als match_parent und wrap_content, die recyclerview ist vollständig aktualisiert und blättert auf die erste position. Warum ist das passiert?
Hinweis: ich habe ähnliche Fragen auf, SO-und keiner von Ihnen bieten eine brauchbare Lösung.
main_layout
<android.support.v7.widget.RecyclerView
android:id="@+id/grid_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="110dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="80dp"
android:background="@color/transparent"
android:outlineProvider="bounds"
android:elevation="8dp"
android:padding="0dp"
android:scrollbars="none" />
....
recycler_view_child_item
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="0dp">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:maxWidth="126dp"
android:maxHeight="225dp"
android:padding="0dp"/>
</RelativeLayout>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche Problem und konnte keine Lösung finden SO entweder. Das Problem wurde verursacht, indem nicht die Einstellung einer
LayoutManager
für dieRecyclerView
. Ich weiß, Sie sagen, Sie haben eineLinearLayoutManager
. Aber stellen Sie sicher, dass Sie es eingerichtet haben, in der folgenden Weise. (In meinem Fall, ich bin mit einemHorizontalGridView
, aber das gleiche Prinzip gilt fürRecyclerView
).Die Aktualisierung geschieht wahrscheinlich, weil Sie nicht angegeben haben, die Größe der untergeordneten Ansichten. Erste Sache, die ich tun würde, ist, entfernen Sie die RelativeLayout, das reduziert den Blick auf die Tiefe, da es scheint nicht, um jeden Zweck. Auch wenn das Kind Blick auf die recyclerView sind immer die gleichen Größe legen Sie es auf die childViews sich statt der parentView aka die recyclerView. Auch hast du setHasFixedSize auf true recyclerView?
Ich hatte das gleiche problem und fand die Antwort von mossy321 nützlich, aber nicht alles fix für mich. In meiner Bewerbung hatte ich eine Liste von Objekten, und jede hatte eine Zeit auf, die benötigt werden, erhöht sich alle 30 Sekunden oder so. Ich lief einen timer in der hosting-Fragment, aber die Aktualisierung der Daten verursacht der springende problem.
Mein recycler-code ist wie folgt:
Beachten ist hier, dass die setHasFixedSize ist kritisch. Ich würde vermuten, dass Sie auf Daten ändern, das system neu zu zeichnen, die Aussicht zwingt den Sprung an die Spitze problem, aber wenn Sie weiß, dass Sie gehen, um die gleiche Größe, kann es einfach aktualisieren Sie den geänderten text in diesem Fall.
Das andere problem war, dass ich NICHT notifyDatasetChanged oder wäre es immer noch verursachen das gleiche problem. Ich hatte zu Benachrichtigen, die für jedes Element einzeln. Dies ist, was der Gegenstand animator ist für den recycler Erklärung. Ohne, dass die items, die würde, flash zu aktualisieren.
Blättern Sie RecyclerView bestimmten position, wenn Sie aufgerufen notifyDataSetChanged