Логика приложения следующая. Прилага парсит первую страницу новостного портала и отображает ее в RecyclerView, как только пользователь прокручивает список до конца - идет парсинг второй страницы и отображение следующей пачки новостей в списке и тд (бесконечный список новостей). Но я не понимаю, как вставить ProgressBar в конец списка, чтобы он отображался до того момента, пока не загрузится следующая пачка новостей. Я даже не понимаю логику, как это организовать правильно.
Подскажите мне, пожалуйста. Буду очень благодарен! Читаю материал из интернета и все равно не понимаю.
Вопрос очень обширный, поэтому в общих чертах:
Создаете 2 типа айтемов в RecyclerView: первый тип -- обычное содержимое, второй -- айтем с прогресс баром (читать по ключу recycler view two view types).
Далее, с помощью OnScrollListener следите за видимыми в RecyclerView айтемами. Как только покажется нужный айтем (например, (N-2)-й при размере списка N) -- добавляете элемент с прогресс баром и начинаете загрузку данных. Как только загрузка данных завершилась -- убираете элемент с прогресс баром и добавляете данные.
Также здесь стоит не забывать, что загрузка данных может завершиться неудачно и этот случай нужно как-то обрабатывать (например, заменять айтем с прогресс баром на элемент с кнопкой "Try again").
Здесь же необходимо помнить, что при быстром скролле списка, OnScrollListener, грубо говоря, может пропускать отрисовку некоторых элементов (т.е. метод findLastVisibleItemPosition LayoutManager-а вернет, например, 5, а затем сразу 7. Это стоит помнить при страте загрузки следующей порции данных на НЕпоследнем элементе. Например, пусть в списке 10 элементов, Вы хотите начинать загружать данные, когда виден 8-й элемент -- в этом случае при отображении 8, 9 и 10 элементов нужно проверять, стартовала ли загрузка, и, если не стартовала, то запускать ее.
Поясню предыдущей абзац на пример:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
int lastVisibleItemPosition = mLayoutManager.findLastVisibleItemPosition();
Log.d("SOME_TAG, "lastVisibleItemPosition: " + lastVisibleItemPosition);
}
}
}
При быстром скролле списка, в логе Вы можете увидеть, например:
...
lastVisibleItemPosition: 6
lastVisibleItemPosition: 7
lastVisibleItemPosition: 10
В интернете очень много информации по этой теме (читать по android recyclerview endless scrolling).
Вот здесь есть неплохая статья.
Не надо мучаться и изобретать велосипеды. Надо просто использовать SwipeRefreshLayout, типа:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
Далее в коде надо слушать листенер назначаемый вызовом SwipeRefreshLayout.setOnRefreshListener() и в нем реализовывать логику обновления новых записей.
Выглядит примерно так:
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости