Это непростая ситуация, извините, что документов недостаточно.
Когда содержимое адаптера изменяется (и вы вызываете 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)
Вы должны использовать положение макета, потому что оно соответствует тому, что пользователь в данный момент видит на экране.