Я создаю бесконечный список горизонтальной прокрутки, используя представление Recycler. 1-2 дочерних элемента могут быть видны на экране все время (поскольку их ширина больше, чем окно просмотра экрана, поэтому у нас никогда не будет видно более 2 дочерних элементов).
Исходное состояние:
Пока пользователь прокручивает (он может прокручивать ОБА вперед и назад, но для встряхивания этого примера предположим, что он прокручивает НАЗАД), я извлекаю больше данных и добавляю их в начало к моим данным адаптера.
Затем я звоню notifyItemRangeInserted
- пока все хорошо.
После добавления:
Время отсечения:
В то же время я добавляю все эти дочерние элементы, которые я проверяю, теперь мы получаем более MAX_DATASOURCE_CNT
элементов в источнике данных.
Предположим, что MAX_DATASOURCE_CNT
равно 6 для этого примера.
Если да, я удаляю лишние дочерние элементы из конца нашего источника данных, а затем вызываю notifyItemRangeRemoved
.
Я делаю это, потому что не хочу загружать устройство неиспользуемыми данными. Сейчас я слишком упрощаю пример, но на самом деле мое представление может накапливать тысячи неиспользуемых элементов данных, когда пользователь прокручивает, и я хочу обрезать противоположный конец моего источника данных на лету.
Проблема:
После того, как процесс prepend имеет место, если пользователь прокручивает слишком быстро, иногда onBindViewHolder(RecyclerView.ViewHolder holder, int position)
get вызывается с position == 0
(также holder.getAdapterPosition() == 0
)
Это полностью искажает мою точку зрения, как если бы она перескочила на совершенно не относящегося к делу ребенка и показала его.
Текущий обходной путь:
Я заметил, что если я удалю весь процесс отсечения, который в основном состоит из этих строк кода:
if (itemCountAfterPrepend > MAX_DATASOURCE_CNT) {
int extraItemCnt = itemCountAfterPrepend - MAX_DATASOURCE_CNT;
// remove every extra item from the end of the array
removeRange(MAX_DATASOURCE_CNT, itemCountAfterPrepend);
// and notify our adapter about the removal
notifyItemRangeRemoved(MAX_DATASOURCE_CNT, extraItemCnt);
}
все работает нормально. Но я действительно хочу обрезать свои данные. Что я могу сделать?
Спасибо
MAX_DATASOURCE_CNT
? - person Jantzilla   schedule 01.06.2018