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.