Я хотел бы изменить ListView
на RecyclerView
. Я хочу использовать onScroll
из OnScrollListener
вRecyclerView
, чтобы определить , является ли пользователь прокручивается до конца списка.
Как узнать, прокручивает ли пользователь конец списка, чтобы я мог получить новые данные из службы REST?
cwac-endless
дляListView
.Ответы:
Спасибо @Kushal, и вот как я это реализовал
Не забудьте добавить
источник
StaggeredGridLayoutManager
mLayoutManager.findLastCompletelyVisibleItemPosition()==mLayoutManager.getItemCount()-1
findFirstVisibleItemPosition()
не решил, вы должны перейтиRecyclerView.LayoutManager
наLinearLayoutManager
loading = true
снова?loading = true
после//Do pagination
части. в противном случае этот код будет выполняться только один раз, и вы не сможете загрузить больше элементов.Сделайте эти переменные.
Установите на прокрутку для просмотра переработчика.
и для сетки
Веселитесь со своими бесконечными свитками !! ^. ^
Поскольку Android теперь официально поддерживает Kotlin, вот обновление для того же самого -
Сделай OnScrollListener
и добавьте его в свой RecyclerView, как это
Для полного примера кода, не стесняйтесь обращаться к этому репозиторию Github .
источник
findFirstVisibleItemPosition()
метод доступен только с LinearLayoutManager, я не могу понять, как заставить его работать.visibleItemCount = mLayoutManager.getChildCount();
ведет себя так же, как использованиеvisibleItemCount = mRecyclerView.getChildCount();
.int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
Для тех, кто хочет получать уведомления только тогда, когда последний элемент полностью показан, вы можете использовать
View.canScrollVertically()
.Вот моя реализация:
Примечание: вы можете использовать,
recyclerView.getLayoutManager().canScrollVertically()
если хотите поддерживать API <14.источник
RecyclerView
вам снова повезет, потому что вы можете просто сделать статическую копию,View.canScrollVertically()
поскольку связанные методы помечены как открытые, а не как защищенныеRecyclerView
. Вы также можете расширить,RecyclerView
чтобы повторно реализовать,canScrollVertically()
если хотите. Третий и простой способ - позвонитьrecyclerView.getLayoutManager().canScrollVertically()
. Отредактировано в моем ответе.Вот другой подход. Это будет работать с любым менеджером макета.
Для подробного понимания я написал сообщение в блоге и пример проекта, получите его здесь http://sab99r.com/blog/recyclerview-endless-load-more/
MyAdapter.java
MyActivity.java
источник
Мой ответ - модифицированная версия Noor. Я перешел от того,
ListView
где у меня былоEndlessScrollListener
(что вы можете легко найти во многих ответах на SO), кRecyclerView
такому, как я хотел,EndlessRecyclScrollListener
чтобы легко обновить моего прошлого слушателя.Итак, вот код, надеюсь, он поможет:
источник
Для меня это очень просто:
Будьте осторожны с асинхронными заданиями: в конце асинхронных заданий необходимо изменить mLoading. Надеюсь, это будет полезно!
источник
Большинство ответов предполагают
RecyclerView
использованиеLinearLayoutManager
, илиGridLayoutManager
, или дажеStaggeredGridLayoutManager
, или предполагают, что прокрутка является вертикальной или горизонтальной, но никто не опубликовал полностью общий ответ .Использование
ViewHolder
адаптера - явно не хорошее решение. Адаптер может использовать более одногоRecyclerView
. Это "адаптирует" их содержание. Это должен быть Recycler View (это тот класс, который отвечает за то, что в данный момент отображается пользователю, а не адаптер, который отвечает только за предоставление контентаRecyclerView
), который должен уведомить вашу систему о том, что нужно больше элементов (чтобы нагрузка).Вот мое решение, использующее только абстрагированные классы RecyclerView (RecycerView.LayoutManager и RecycerView.Adapter):
источник
LayoutManagers
но только на один момент: переместите код расчета в другой метод scrollListener -onScrollStateChanged
вместо этого переместите его вonScrolled
. И вonScrollStateChanged
только что проверьте:if(newState == RecyclerView.SCROLL_STATE_IDLE) { // calculation code }
Хотя принятый ответ работает отлично, в приведенном ниже решении используется addOnScrollListener, поскольку setOnScrollListener устарела и уменьшает количество переменных и условия.
источник
Хотя ответов на этот вопрос так много, я хотел бы поделиться нашим опытом создания бесконечного представления списка. Недавно мы внедрили собственный Карусельный LayoutManager, который может работать в цикле, прокручивая список бесконечно, а также до определенной точки. Вот подробное описание на GitHub .
Я предлагаю вам взглянуть на эту статью с краткими, но ценными рекомендациями по созданию пользовательских LayoutManager: http://cases.azoft.com/create-custom-layoutmanager-android/
источник
Благодаря мощным функциям расширения Kotlin код может выглядеть намного элегантнее. Поместите это куда угодно (у меня это внутри файла ExtensionFunctions.kt):
И затем используйте это так:
Это решение основано на ответе Кушала Шармы. Тем не менее, это немного лучше, потому что:
onScrollStateChanged
вместоonScroll
. Это лучше, потому чтоonScroll
вызывается каждый раз, когда есть какое-либо движение в RecyclerView, тогда какonScrollStateChanged
вызывается только тогда, когда состояние RecyclerView изменяется. С помощьюonScrollStateChanged
сэкономит вам процессорное время и, как следствие, батарею.источник
SwipeRefreshLayout's setOnRefreshListener the addOnScrolledToEnd is not working
закрытый внутренний класс ! .isRefreshing = false}}Вот как я это делаю, просто и коротко:
источник
Хорошо, я сделал это с помощью метода onBindViewHolder RecyclerView.Adapter.
адаптер:
Фрагмент (или Деятельность) :
источник
onBindViewHolder()
, она работает как шарм. Реализация крошечная по сравнению со слушателем прокрутки и проще в использовании.Мой способ обнаружить событие загрузки состоит не в том, чтобы обнаружить прокрутку, а в том, чтобы прослушать, был ли присоединен последний вид. Если последний вид был прикреплен, я считаю, что это время для загрузки большего количества контента.
источник
Я бы попытался расширить используемый
LayoutManager
(напримерLinearLayoutManager
) и переопределитьscrollVerticallyBy()
метод. Во-первых, я быsuper
сначала позвонил, а затем проверил возвращаемое целочисленное значение. Если значение равно,0
то достигается нижняя или верхняя граница. Затем я использовал быfindLastVisibleItemPosition()
метод, чтобы выяснить, какая граница достигнута, и при необходимости загрузить больше данных. Просто идея.Кроме того, вы даже можете вернуть свое значение из этого метода, позволяя прокрутку и показывать индикатор «загрузки».
источник
источник
onScrollStateChanged()
не будет работать, так как он будет вызываться только при изменении состояния прокрутки, а не при прокрутке. Вы должны использоватьonScrolled()
метод.Я достиг бесконечной реализации типа прокрутки, используя эту логику в
onBindViewHolder
методе моегоRecyclerView.Adapter
класса.С этим кодом, когда RecyclerView достигает последнего элемента, он увеличивает текущую страницу и обратные вызовы на интерфейсе, который отвечает за загрузку большего количества данных из API и добавление новых результатов в адаптер.
Я могу опубликовать более полный пример, если это не ясно?
источник
Для людей, которые используют StaggeredGridLayoutManager, вот моя реализация, она работает для меня.
источник
Существует легкая в использовании библиотека для этого paginate . Поддерживает как ListView, так и RecyclerView (LinearLayout, GridLayout и StaggeredGridLayout).
Вот ссылка на проект на Github
источник
Создайте абстрактный класс и расширяйте RecyclerView.OnScrollListener
в действии (или фрагменте) добавьте addOnScrollListener в recyclerView
источник
У меня есть довольно подробный пример того, как разбивать на страницы с помощью RecyclerView. На высоком уровне у меня есть набор PAGE_SIZE, скажем, 30. Итак, я запрашиваю 30 пунктов, и если я получу 30 обратно, я запрашиваю следующую страницу. Если я получаю менее 30 элементов, я помечаю переменную, чтобы указать, что была достигнута последняя страница, а затем прекращаю запрашивать дополнительные страницы. Проверьте это и дайте мне знать, что вы думаете.
https://medium.com/@etiennelawlor/pagination-with-recyclerview-1cb7e66a502b
источник
Вот мое решение, использующее AsyncListUtil в Интернете: «Обратите внимание, что этот класс использует один поток для загрузки данных, поэтому он подходит для загрузки данных из вторичного хранилища, такого как диск, но не из сети. но я использую odata, чтобы читать данные и работать нормально. Я скучаю в моем примере объектов данных и сетевых методов. Я включаю только пример адаптера.
источник
@kushal @abdulaziz
Почему бы не использовать эту логику вместо этого?
источник
end_of_list
условие будет вызвано только один раз. Флаг_isLastItem
- это глобальная переменная в деятельности, значение по умолчанию которой равноfalse
. Я выполнил фоновую задачу после определения конца списка, получения следующей страницы, затем уведомил адаптер о новом наборе данных и, наконец,_isLastItem
снова установил значение false.Попробуйте ниже:
источник
LoadMoreRecyclerView
WrapperLinearLayout
// Добавить его в xml как
OnCreate или onViewCreated
callYourService
источник
Также возможно реализовать без прослушивателя прокрутки, используя только чистую логику модели данных. Представление прокрутки требует, чтобы получить элементы по позиции, а также максимальное количество элементов. Модель может иметь фоновую логику для выборки нужных элементов по частям, а не по одному, и делать это в фоновом потоке, уведомляя представление о готовности данных.
Этот подход позволяет иметь очередь выборки, которая предпочитает самые последние запрашиваемые (так видимые в настоящее время) элементы по сравнению со старыми (вероятнее всего, уже прокрученными) представлениями, контролировать количество используемых параллельных потоков и тому подобное. Полный исходный код для этого подхода (демонстрационное приложение и многоразовая библиотека) доступен здесь .
источник
Есть метод
public void setOnScrollListener (RecyclerView.OnScrollListener listener)
в https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29 . Используйте этоРЕДАКТИРОВАТЬ:
Переопределите
onScrollStateChanged
метод внутриonScrollListener
и сделайте этоисточник
onScrollStateChanged
onScrollStateChanged
не будет работать, так как он будет вызываться только при изменении состояния прокрутки, а не при прокрутке.onScrollStateChanged
определить, что пользователь прокручивает до последнего элемента?Проверьте это, все объясняется подробно: разбиение на страницы с помощью RecyclerView от А до Я
loadMoreItems ():
в MyAdapter:
источник
Ни один из этих ответов не учитывается, если список слишком мал или нет.
Вот фрагмент кода, который я использовал, который работает с RecycleViews в обоих направлениях.
источник
Я позволю тебе мое приближение. У меня отлично работает.
Я надеюсь, что это поможет вам.
источник
Это решение отлично работает для меня.
источник