Как НЕ прокручивать после notifyDataSetChanged на RecyclerView.Adapter - PullRequest
0 голосов
/ 07 июня 2018

иногда я заменяю все данные из моего источника данных 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) возвращает уникальный идентификатор для каждого ребенка.

Пожалуйста, помогите!

...