У меня есть Фрагмент с BottomSheet , который содержит горизонтальное RecyclerView . RecyclerView настраивается с помощью SnapHelper для достижения эффекта страницы. Это выглядит примерно так:
![enter image description here](https://i.stack.imgur.com/WTVVv.png)
В событии onCreateView в Фрагмент , я установил Адаптер и LayoutManager :
recycler_view.setAdapter(new MyRecyclerAdapter(getContext(), dataList));
recycler_view.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
После того, как я установил Адаптер , событие onCreateViewHolder запускается в MyRecyclerAdapter объект класса, за которым следует onBindViewHolder :
@Override
public MyRecyclerAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.fragment_recycler_item, parent, false);
return new MyViewHolder(view, parent);
}
@Override
public void onBindViewHolder(MyRecyclerAdapter.MyViewHolder viewHolder, int position) {
/**I do something using position**/
}
Когда я создаю этот Фрагмент и настраиваю RecyclerView для первого время-все работает хорошо, onBindViewHolder возвращает правильную позицию. Но когда я переключаюсь на 1, 2 и т. Д. c. элемент RecyclerView , а затем воссоздать фрагмент по неизвестной причине onBindViewHolder вернуть старую (последнюю) позицию, хотя новые Adapter и LineraLayoutManager были созданы.
Для ясности я разбью его на этапы:
- Создание Фрагмента .
- Создание объекта класса MyRecyclerAdapter . Установите его в RecyclerView .
- Создание объекта класса LinearLayoutManager . Установите его в RecyclerView .
- Событие onBindViewHolder в MyRecyclerAdapter запущено. Я получаю position = 0 .
- Я выделяю элемент с position = 2 .
- Я отсоединяю этот фрагмент, а затем сразу присоединяю этот фрагмент.
- Создание объекта класса MyRecyclerAdapter . Установите его в RecyclerView .
- Создание объекта класса LinearLayoutManager . Установите его в RecyclerView .
- Событие onBindViewHolder в MyRecyclerAdapter запущено. Я получаю position = 2 .
Вопрос: Почему я получаю старую позицию и, самое главное, как ее исправить?
Я читал, что Android специально сохраняет старый ViewHolder для более эффективного использования памяти, но мне это не нужно.
UPD (решение) : Мне кажется, что это временное решение (не идеальное), но оно работает. Вам необходимо запустить smoothScrollToPosition (0) после того, как вы установили Adapter и LayoutManager . Очень важно использовать smoothScrollToPosition (0) , а не scrollToPosition (0) :
recycler_view.setAdapter(new MyRecyclerAdapter(getContext(), dataList));
recycler_view.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
recycler_view.smoothScrollToPosition(0);
UPD.1 (лучшее решение ) : Просто используйте это:
recyclerView.setSaveEnabled(false);