Я строю бесконечный горизонтальный список прокрутки, используя представление Recycler.1-2 ребенка могут быть видны на экране все время (так как их ширина больше, чем область просмотра экрана, и поэтому у нас никогда не будет более 2 видимых детей).
Исходное состояние:
Пока пользователь выполняет прокрутку (он может прокручивать ОБА вперед и назад - но для этого примера давайте предположимони прокручивают BACKWARDS ), я извлекаю больше данных и добавляю их к данным моего адаптера.
Затем я звоню notifyItemRangeInserted
- пока все хорошо.
После предварительного добавления:
Время отсечения:
В то же время я добавляю всех тех детей, которых проверяю, теперь у нас получается больше, чем MAX_DATASOURCE_CNT
элементов висточник данных.
Предположим, что MAX_DATASOURCE_CNT
для этого примера 6 .
Если мы это сделаем, я удаляю лишних дополнительных дочерних элементов из конца нашего источника данных иЗвоните notifyItemRangeRemoved
.
Я делаю это, потому что не хочу загружать устройство неиспользуемыми данными.Сейчас я слишком упрощаю пример, но на самом деле мое представление может накапливать тысячи неиспользуемых элементов данных во время прокрутки пользователем, и я хочу урезать противоположный конец моего источника данных на лету.
Проблема:
После того, как происходит процесс предварительной подготовки, если пользователь прокручивает слишком быстро, иногда 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);
}
все работает нормально.Но я действительно хочу урезать свои данные.Что я могу сделать?
Спасибо