Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Подгрузка данных в RecyclerView

#android #json #recyclerview


Реализовал приложение которое грузит статьи с сайта. Статей 400+ через JSON гружу
последние 10. Остальные планирую грузить другим отдельным таском по запросу пользователя.
Вопрос:
Как прикрутить кнопку в низу RecyclerView, что бы можно было при желании подгрузить
следующие 10 статей. Или может что то другое посоветуете?
    


Ответы

Ответ 1



Для автоматической подгрузки, если пользователь прокрутил список до конца, вам нужно использовать кастомный OnScrollListener RecyclerView.OnScrollListener scrollListener = new OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int visibleItemCount = layoutManager.getChildCount();//смотрим сколько элементов на экране int totalItemCount = layoutManager.getItemCount();//сколько всего элементов int firstVisibleItems = layoutManager.findFirstVisibleItemPosition();//какая позиция первого элемента if (!isLoading) {//проверяем, грузим мы что-то или нет, эта переменная должна быть вне класса OnScrollListener if ( (visibleItemCount+firstVisibleItems) >= totalItemCount) { isLoading = true;//ставим флаг что мы попросили еще элемены if(loadingListener != null){ loadingListener.loadMoreItems(totalItemCount);//тут я использовал калбэк который просто говорит наружу что нужно еще элементов и с какой позиции начинать загрузку } } } } }; Не забываем назначить его _recyclerView.setOnScrollListener(scrollListener); Есть небольшая особенность, этот код не будет работать с StaggeredGridLayoutManager Грузите следующую партию статей и добавляете в адаптер, после добавления вызываете у адаптера notifyDataSetChanged() и ставите флаг isLoading = false В адаптере вам нужно сделать что бы его размер был (реальный размер + 1) и отображать последний элемент как индикатор загрузки.

Ответ 2



Ловить момент, когда следует подгружать данные, можно двумя способами: 1) Как и писал SorryForMyEnglish, повесить на RecyclerView слушатель прокрутки и, когда он будет прокручен до последнего элемента, подгружать новую порцию данных. Вот пример реализации такого способа: https://github.com/ziginsider/DynamicLoadingRecyclerView 2) В адаптере можно получить позицию только что появившегося элемента списка. Если позиция появившегося элемента последняя, значит пора подгружать новую порцию данных: @Override public void onViewAttachedToWindow(final ViewHolder holder) { super.onViewAttachedToWindow(holder); int layoutPosition = holder.getLayoutPosition(); // тут проверяем не последний ли элемент и запускаем калбэк // аналогично первому способу }

Ответ 3



Можно вообще ловить это дело в onBindViewHolder Но сначала интерфейс создайте в адаптере public interface OnLoadMoreListener { void onLoadMore(); } Переменную private OnLoadMoreListener onLoadMoreListener; Ну и сеттер для неё public void setOnLoadMoreListener(OnLoadMoreListener listener) { this.onLoadMoreListener = listener; } Теперь создадим в адаптере переменные isLoading и noMore. Первая нужна будет для того, чтобы избежать бага "почему айтемы копируются", а вторая чтобы избежать `почему он вечно крутится". private boolean isLoading, noMore; Сеттеры для них public void endLoading() { this.isLoading = false; } public void setNoMore(boolean noMore) { this.noMore = noMore; } Теперь в onBindViewHolder можно написать так: public void onBindViewHolder(...) { //ваш биндинг if(onLoadMoreListener != null && !isLoading && !noMore && holder.getAdapterPosition() == getItemCount() - 1) { isLoading = true; onLoadMoreListener.onLoadMore(); } } В активности вешаем на адаптер созданный слушатель и в onLoadMore пишем подгрузку, добавляем то что погрузили в общую коллекцию и обновляем список recyclerViewAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore() { List newBooks = //допустим книги и допустим вы их подгрузили totalBooks.addAll(newBooks); //totalBooks это коллекция книг которая содержит все данные для списка recyclerView.notifyDataSetChanged(); recyclerViewAdapter.endLoading(); //когда загрузка завершена recyclerViewAdapter.setNoMore(true); //если подгружать больше нечего } }

Комментариев нет:

Отправить комментарий