иногда я заменяю все данные из моего источника данных ArrayList следующим образом:
private ArrayList data;
public void replaceAll(ArrayList newItems) {
this.data.clear();
for (int i = 0; i < newItems.size(); i++) {
this.data.set(i, newItems.get(i));
}
notifyDataSetChanged();
}
, но если, например, this.data.size() == 50;
и newItems.size() == 30;
и, следовательно, данные изменились с 50 дочерних до 30, после того как язапустите notifyDataSetChanged()
мой RecyclerView прокручивает к следующему дочернему элементу.
(то есть, если я был на позиции 15, он переходит к 16)
Это ТОЛЬКО происходит, когда newDataразмер меньше старого, и я не могу понять, почему.
p.s1: Я пытался запустить:
int childCntWeLostAfterMutation = data.size() - newData.size();
notifyItemRangeChanged(0, newData.size());
notifyItemRangeRemoved(newData.size(), childCntWeLostAfterMutation);
, но потом всестановиться хуже.Он прокручивается намного дальше, и он полностью портит видимую позицию.
p.s2: Пожалуйста, не говорите мне smoothScrollToPosition
, это супер грязно, и я неНе думаю, что это сработает в моем сценарии.
p.s3: Я уже использую setHasStableIds(true)
, и мой public long getItemId(int position)
возвращает уникальный идентификатор для каждого ребенка.
Пожалуйста, помогите!