Esta é uma situação complicada, desculpe que os documentos não são suficientes.
Quando o conteúdo do adaptador muda (e você chama notify***()
), o RecyclerView solicita um novo layout. A partir desse momento, até que o sistema de layout decida calcular um novo layout (<16 ms), a posição do layout e a posição do adaptador podem não corresponder porque o layout ainda não refletiu as alterações do adaptador.
Em seu caso de uso, como seus dados estão relacionados ao conteúdo do adaptador (e presumo que os dados sejam alterados ao mesmo tempo com as alterações do adaptador), você deve usar adapterPosition
.
Porém, tenha cuidado, se você estiver chamando notifyDataSetChanged()
, porque isso invalida tudo, o RecyclerView não sabe a posição do adaptador do ViewHolder até que o próximo layout seja calculado. Nesse caso, getAdapterPosition()
irá retornar RecyclerView#NO_POSITION
( -1
).
Mas digamos que se você chamou notifyItemInserted(0)
, o getAdapterPosition()
de ViewHolder que estava anteriormente na posição 0
começará a retornar 1
imediatamente. Portanto, enquanto você está despachando eventos de notificação granulares, você está sempre em bom estado (sabemos a posição do adaptador, embora o novo layout ainda não tenha sido calculado).
Outro exemplo, se você estiver fazendo algo no clique do usuário, se getAdapterPosition()
retornar NO_POSITION
, é melhor ignorar esse clique porque você não sabe o que o usuário clicou (a menos que você tenha algum outro mecanismo, por exemplo, ids estáveis para pesquisar o item).
Editar para quando a posição do layout for boa
Vamos dizer que você está usando LinearLayoutManager
e deseja acessar o ViewHolder acima do item clicado no momento. Nesse caso, você deve usar a posição do layout para obter o item acima.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Você deve usar a posição do layout porque corresponde ao que o usuário está vendo na tela.