Це складна ситуація, вибачте, що документів недостатньо.
Коли вміст адаптера змінюється (і ви телефонуєте 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)
Ви повинні використовувати положення макета, оскільки воно відповідає тому, що користувач зараз бачить на екрані.