Это непростая ситуация, извините, что документов недостаточно.
Когда содержимое адаптера изменяется (и вы вызываете notify***()), RecyclerView запрашивает новый макет. С этого момента, пока система макета не решит рассчитать новый макет (<16 мс), положение макета и положение адаптера могут не совпадать, поскольку макет еще не отразил изменения адаптера.
В вашем случае использования, поскольку ваши данные связаны с содержимым вашего адаптера (и я предполагаю, что данные изменяются одновременно с изменениями адаптера), вы должны использовать adapterPosition.
Однако будьте осторожны, если вы вызываете notifyDataSetChanged(), поскольку он делает недействительным все, RecyclerView не знает эту позицию адаптера ViewHolder до тех пор, пока не будет рассчитан следующий макет. В этом случае getAdapterPosition()вернется RecyclerView#NO_POSITION( -1).
Но допустим, если вы вызвали notifyItemInserted(0), getAdapterPosition()ViewHolder, который ранее был в позиции 0, 1немедленно начнет возвращаться . Итак, пока вы отправляете подробные события уведомления, вы всегда в хорошем состоянии (мы знаем положение адаптера, даже если новый макет еще не рассчитан).
Другой пример: если вы что-то делаете при щелчке пользователем, в случае getAdapterPosition()возврата NO_POSITIONлучше всего игнорировать этот щелчок, потому что вы не знаете, какой пользователь щелкнул (если у вас нет другого механизма, например, стабильных идентификаторов для поиска элемента).
Редактировать, когда расположение макета хорошее
Допустим, вы используете LinearLayoutManagerи хотите получить доступ к ViewHolder над текущим выбранным элементом. В этом случае вы должны использовать позицию макета, чтобы получить элемент выше.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Вы должны использовать положение макета, потому что оно соответствует тому, что пользователь в данный момент видит на экране.