Когда я добавляю данные в адаптер для RecyclerView скрол виснет на 1 секунду, как решить? Всем привет есть вот такая разметка





Я создаю свою View и кидаю ее в fragment_main_controller потом еще создаю LinearLayout(container_recycler_view) присоединяю ее к fragment_main_controller и динамически создаю адаптер и RecyclerView и через addView добавляю это все в container_recycler_view
Когда я подгружаю из сети данные и начинаю их вставлять (кроме первого раза так, так как все пока что пусто), все это начинает виснуть на секунду (когда обновляю адаптер),
виснуть начинает именно скролл
Добавляю новые элементы и обновляю адаптер вот так:int v = adapter.getMyModels().size() - 1;
adapter.getMyModels().addAll(myModelPages.getMyModels());
adapter.notifyItemRangeChanged(v, adapter.getMyModels().size() - v);
(пробовал и notifydatasetchanged такой же результат)
Вот код самого адаптера:public static class ViewHolderMyModel extends RecyclerView.ViewHolder {
public ItemMyModelWidget itemMyModelWidget;
public ViewHolderQuestion(ItemMyModelWidget v) {
super(v);
itemMyModelWidget = v;
}
}
@Override
public Adapter.ViewHolderMyModel onCreateViewHolder(ViewGroup parent, int viewType) {
ItemMyModelWidget itemMyModelWidget = new ItemMyModelWidget(parent.getContext());
ViewHolderMyModel viewHolder = new ViewHolderMyModel(itemMyModelWidget);
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final ViewHolderMyModel viewHolderMyModel = (ViewHolderMyModel) holder;
final MyModel model = myModels.get(position);
/* Вставляю текст в itemMyModelWidget и так далее*/
}
В чем может быть проблема?
То есть я понял так, что когда я обновляю адаптер для новых элементов они почему то прорисовываются поэтому если скрол находится не в самом низу он начинает виснуть так как добавляются элементы

21 Авг 2019 в 06:24
205 +1
0
Ответы
1

Проблема может быть связана с тем, что при обновлении адаптера происходит перерисовка всех элементов RecyclerView, включая уже видимые на экране. Если в этот момент в RecyclerView находится большое количество элементов, то операция обновления может занять некоторое время и вызвать "притормаживание" скролла.

Один из способов решения этой проблемы - использовать методы notifyItemInserted(), notifyItemRangeInserted() и другие методы уведомления адаптера, которые позволяют добавить элементы без необходимости полной перерисовки. Вы можете вызывать эти методы после добавления новых элементов в список, чтобы адаптер обновлял только необходимые элементы, а не все.

Пример кода для добавления элементов в RecyclerView с использованием метода notifyItemInserted():

int startPosition = adapter.getMyModels().size();
adapter.getMyModels().addAll(myModelPages.getMyModels());
adapter.notifyItemRangeInserted(startPosition, myModelPages.getMyModels().size());

Также рекомендуется использовать пагинацию для загрузки данных по мере прокрутки, чтобы избежать добавления большого количества элементов одновременно и улучшить производительность при работе с большими наборами данных.

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир