Стратегии отображения большого набора данных в Android RecyclerView

Реализации RecyclerView обычно имеют следующий подход:

  • создайте RecyclerAdapter, содержащий набор данных или ссылку на него, например. Список
  • прикрепить адаптер и LayoutManager к RecyclerView
  • вызовите setItems (или эквивалент) на адаптере, чтобы обновить содержимое
  • опционально добавьте нумерацию страниц + бесконечную прокрутку, чтобы иметь возможность постепенно загружать больше контента маленькими кусочками за раз

Это использует мощь RecyclerView и ViewHolder для эффективного отображения огромных наборов данных. Однако это не решает проблему хранения набора данных в памяти, о чем мой вопрос.

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

Есть ли более эффективный способ сделать это? Мои первоначальные мысли состояли в том, чтобы иметь какой-то подход, основанный на скользящем окне, где мы будем хранить фиксированное количество страниц в памяти и иметь двустороннюю бесконечную реализацию прокрутки, где окно следующей/предыдущей страницы обновляется по мере изменения области просмотра прокрутки, в то время как пользовательские прокрутки. Не уверен, что это повлияет на производительность прокрутки...


person Georgi    schedule 28.02.2021    source источник


Ответы (1)


рассмотрим библиотеку подкачки Android

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

Он поддерживает чтение из базы данных, а также чтение из сети или гибрид двух, поэтому он должен подойти для того, что вам нужно.


Я полагаю, стоит сказать, что если у вас уже есть собственная реализация, вы также можете попытаться имитировать это поведение. Если у вас есть способ узнать, что пользователь достиг определенного порога в данных, которые вы отображаете, вы можете загрузить следующую/предыдущую страницу самостоятельно, а затем просто управлять объемом данных, которые вы храните в памяти самостоятельно. одной страницы вверх/вниз может быть достаточно, что-то еще, что вы могли бы очистить свою локальную память

person a_local_nobody    schedule 28.02.2021
comment
Ха! Я не знал об этой библиотеке, похоже, она создана именно для этого. Даже поддерживает предварительную загрузку страниц просмотра. Подождем немного, прежде чем пометить ответ как правильный, чтобы увидеть другие предложения. Спасибо - person Georgi; 28.02.2021
comment
я не точно уверен, в каком состоянии находится библиотека, но я использовал ее дважды, в первый раз было немного хаотично, но версия 3 (которая в настоящее время находится в альфа-версии) была много проще, так что, возможно, попробуйте, для чего это стоит - person a_local_nobody; 28.02.2021
comment
в любом случае, рад, что это может помочь - person a_local_nobody; 28.02.2021
comment
Наверняка стоит попробовать, настройка в документах выглядит достаточно просто ???? - person Georgi; 28.02.2021
comment
насколько я помню, стандартная библиотека подкачки была немного сложной, нужно было создать 3 разных типа фабрик DataSource (или что-то в этом роде), и я нашел это немного запутанным, но подкачка 3 избавляется от этого и просто позволяет вам разбирайтесь с этим сами, но это все полностью мое личное мнение, я могу подтвердить, что библиотека действительно работает очень хорошо, я видел и использовал ее ранее - person a_local_nobody; 28.02.2021
comment
Круто, у меня было чувство, что уже будет что-то, что обрабатывает подобные варианты использования. Большинство примеров, которые я нашел, показывают только настройку vanilla RecyclerView, так что это определенно многообещающе. - person Georgi; 28.02.2021