C'est une situation délicate, désolé que les documents ne soient pas suffisants.
Lorsque le contenu de l'adaptateur change (et que vous appelez notify***()
), RecyclerView demande une nouvelle disposition. À partir de ce moment, jusqu'à ce que le système de mise en page décide de calculer une nouvelle mise en page (<16 ms), la position de mise en page et la position de l'adaptateur peuvent ne pas correspondre car la mise en page n'a pas encore reflété les changements d'adaptateur.
Dans votre cas d'utilisation, puisque vos données sont liées au contenu de votre adaptateur (et je suppose que les données sont modifiées en même temps avec les changements d'adaptateur), vous devriez utiliser adapterPosition
.
Attention cependant, si vous appelez notifyDataSetChanged()
, car il invalide tout, RecyclerView ne sait pas que la position de l'adaptateur de ViewHolder jusqu'à ce que la disposition suivante soit calculée. Dans ce cas, getAdapterPosition()
retournera RecyclerView#NO_POSITION
(-1
).
Mais disons que si vous avez appelé notifyItemInserted(0)
, le getAdapterPosition()
de ViewHolder qui était auparavant à la position 0
commencera à revenir 1
immédiatement. Ainsi, tant que vous distribuez des événements de notification granulaires, vous êtes toujours en bon état (nous connaissons la position de l'adaptateur même si la nouvelle mise en page n'est pas encore calculée).
Un autre exemple, si vous faites quelque chose sur le clic de l'utilisateur, s'il getAdapterPosition()
retourne NO_POSITION
, il est préférable d'ignorer ce clic parce que vous ne savez pas sur quel utilisateur a cliqué (sauf si vous avez un autre mécanisme, par exemple des identifiants stables pour rechercher l'élément).
Modifier pour lorsque la position de la disposition est bonne
Disons que vous utilisez LinearLayoutManager
et souhaitez accéder au ViewHolder au-dessus de l'élément actuellement cliqué. Dans ce cas, vous devez utiliser la position de mise en page pour obtenir l'élément ci-dessus.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Vous devez utiliser la position de la mise en page car elle correspond à ce que l'utilisateur voit actuellement à l'écran.