Dies ist eine schwierige Situation. Es tut uns leid, dass die Dokumente nicht ausreichen.
Wenn sich der Adapterinhalt ändert (und Sie aufrufen notify***()
), fordert RecyclerView ein neues Layout an. Von diesem Moment an, bis das Layoutsystem beschließt, ein neues Layout zu berechnen (<16 ms), stimmen Layoutposition und Adapterposition möglicherweise nicht überein, da das Layout noch keine Adapteränderungen widerspiegelt.
In Ihrem Anwendungsfall sollten Sie verwenden, da Ihre Daten mit dem Inhalt Ihres Adapters zusammenhängen (und ich gehe davon aus, dass die Daten gleichzeitig mit den Änderungen des Adapters geändert werden) adapterPosition
.
Seien Sie jedoch vorsichtig, wenn Sie anrufen notifyDataSetChanged()
, da dies alles ungültig macht. RecyclerView kennt die Adapterposition von ViewHolder erst, wenn das nächste Layout berechnet wird. In diesem Fall getAdapterPosition()
wird return RecyclerView#NO_POSITION
( -1
).
Angenommen, Sie haben angerufen notifyItemInserted(0)
, und der getAdapterPosition()
zuvor an Position befindliche ViewHolder 0
kehrt 1
sofort zurück. Solange Sie granulare Benachrichtigungsereignisse auslösen, sind Sie immer in einem guten Zustand (wir kennen die Adapterposition, obwohl das neue Layout noch nicht berechnet wurde).
Ein weiteres Beispiel, wenn Sie etwas auf Benutzer klicken Sie tun, wenn getAdapterPosition()
zurückkehrt NO_POSITION
, ist es am besten , dass die Klick zu ignorieren , weil Sie nicht wissen , welche Benutzer geklickt hat (es sei denn , Sie einen anderen Mechanismus haben, zum Beispiel stabile ids das Element Lookup).
Bearbeiten für, wenn die Layoutposition gut ist
Nehmen wir an, Sie verwenden LinearLayoutManager
den ViewHolder über dem aktuell angeklickten Element und möchten darauf zugreifen. In diesem Fall sollten Sie die Layoutposition verwenden, um das obige Element zu erhalten.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Sie müssen die Layoutposition verwenden, da sie mit der aktuellen Position des Benutzers auf dem Bildschirm übereinstimmt.
Um die Differenz (en) der argumentieren
getAdapterPosition()
,getLayoutPosition()
und auchposition
; Wir würden die folgenden Fälle bemerken:1.
position
Argument inonBindViewHolder()
Methode:Wir können die Verwendung
position
zu binden Daten zur Ansicht und es ist in Ordnung zu verwendenposition
Argument , dies zu tun, aber es ist nicht in Ordnung zu verwendenposition
Argument handle Benutzer klickt und wenn Sie es verwendet wird , wird eine Warnung sagt Ihnen , „nicht zu behandeln sehen ,position
wie behoben undholder.getAdapterPosition()
stattdessen verwenden ".2 .
getAdapterPosition()
:Diese Methode besteht immer aus der Position des aktualisierten Adapters des
holder
. Wenn Sie auf ein Element klicken, fragen Sie den Adapter danachposition
. So erhalten Sie die neueste Position dieses Elements in Bezug auf die Adapterlogik.3 .
getLayoutPosition()
:Manchmal ist es erforderlich,
position
das aktualisierte Layout zu ermitteln (das zuletzt übergebene Layout, das der Benutzer jetzt sieht), zum Beispiel: Wenn der Benutzer nach dem dritten fragt, dasposition
er sehen kann, und Sieswipe
/dismiss
für Elemente verwenden oder eine Animation anwenden oder Dekorationen für die Einzelteile wird es besser sein zu verwenden ,getLayoutPosition()
stattgetAdapterPosition()
, weil Sie immer sicher sein, dass Sie mit dem Artikel Position in Bezug auf die neuesten weitergegeben Layout handelt.Weitere Informationen hierzu; siehe hier . . .
quelle