Questa è una situazione delicata, mi dispiace che i documenti non siano sufficienti.
Quando il contenuto dell'adattatore cambia (e tu chiami notify***()) RecyclerView richiede un nuovo layout. Da quel momento, fino a quando il sistema di layout non decide di calcolare un nuovo layout (<16 ms), la posizione del layout e la posizione dell'adattatore potrebbero non corrispondere perché il layout non ha ancora riflesso le modifiche dell'adattatore.
Nel tuo caso d'uso, poiché i tuoi dati sono correlati al contenuto dell'adattatore (e presumo che i dati vengano modificati contemporaneamente con i cambiamenti dell'adattatore), dovresti usare adapterPosition .
Fai attenzione però, se stai chiamando notifyDataSetChanged(), perché invalida tutto, RecyclerView non sa che la posizione dell'adattatore di ViewHolder fino a quando non viene calcolato il layout successivo. In tal caso, getAdapterPosition()restituirà RecyclerView#NO_POSITION(-1 ).
Ma diciamo che se hai chiamato notifyItemInserted(0), il getAdapterPosition()di ViewHolder che era precedentemente nella posizione 0inizierà a tornare 1immediatamente. Quindi, finché invii eventi di notifica granulari, sei sempre in buono stato (conosciamo la posizione dell'adattatore anche se il nuovo layout non è stato ancora calcolato).
Un altro esempio, se stai facendo qualcosa al clic dell'utente, se getAdapterPosition()ritorna NO_POSITION, è meglio ignorare quel clic perché non sai quale utente ha cliccato (a meno che tu non abbia qualche altro meccanismo, ad esempio ID stabili per cercare l'elemento).
Modifica per quando la posizione del layout è buona
Diciamo che stai usando LinearLayoutManagere vuoi accedere al ViewHolder sopra l'elemento attualmente cliccato. In tal caso, dovresti utilizzare la posizione del layout per ottenere l'elemento sopra.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
È necessario utilizzare la posizione del layout perché corrisponde a ciò che l'utente sta attualmente vedendo sullo schermo.