Как внедрить механизм подкачки в RecyclerView с потенциально большим источником данных?

Я ищу хороший способ реализовать механизм пейджинга в моих списках RecyclerView. Я использую AsyncTaskLoader для заполнения и кэширования данных в RecyclerView.

public class HeadlinesListLoader extends AsyncTaskLoader<List<Headline>> {

    public HeadlinesListLoader(Context context) {
        super(context);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public List<Headline> loadInBackground() {
        return DataManager.getInstance().findAllHealines();
    }

    @Override
    public void deliverResult(List<Headline> data) {
        super.deliverResult(data);
    }
} 

Где DataManager.getInstance().findAllHealines(); выполняет вызов RESTful для извлечения данных списка, однако в настоящее время он загружает все данные сразу, что может занять значительное время.

Я искал эффективный способ постепенной загрузки данных в RecyclerView по мере необходимости. Я наткнулся на эту библиотеку подкачки, рекомендованную Android:

https://developer.android.com/topic/libraries/architecture/paging.html

Однако то, как он запрашивает базу данных во внешнем интерфейсе, не похоже на правильное решение в моем случае, и, поскольку я использую AsyncTaskLoader, мне интересно, есть ли способ решить эту проблему, используя сам фреймворк Loaders. ? Или какой вариант будет лучше?

Я открыт для любых предложений. Спасибо.


person Mohamed Abulgasem    schedule 10.02.2018    source источник
comment
Есть ли у вас поддержка разбивки на страницы с вашего внутреннего сервера?   -  person Reaz Murshed    schedule 11.02.2018
comment
@ReazMurshed Нет, не знаю. Я подумал, что может быть способ сделать это из внешнего интерфейса с помощью загрузчиков. Тем не менее, я думаю, что мне следует сделать это таким образом, чтобы у меня была функция nextLoad() на бэкэнде, которая срабатывала всякий раз, когда на бэкенде требуется новая загрузка?   -  person Mohamed Abulgasem    schedule 12.02.2018
comment
В яблочко. Например, внутренний сервер сначала предоставит вам первые 10 строк. Затем у вас будет кнопка загрузки на вашем конце, и нажатие на эту кнопку вызовет тот же вызов API со страницей номер 2. Когда серверная часть получит запрос со страницей номер 2, он будет обслуживать вас следующие 10 строк который вы добавите в свой RecyclerView и так далее.   -  person Reaz Murshed    schedule 12.02.2018
comment
@ReazMurshed Спасибо, я сейчас так и поступаю.   -  person Mohamed Abulgasem    schedule 16.02.2018
comment
Рад узнать, что смог вам помочь. Добро пожаловать!   -  person Reaz Murshed    schedule 16.02.2018


Ответы (1)


Вы можете сделать это в событии прокрутки.

YourListElement.addOnScrollListener(new RecyclerView.OnScrollListener() {
        boolean isSlidingToLast = false;
        int lastVisibleItemPosition = 0;
        int lastPositions = 0;

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE && linearLayoutManager.getItemCount() > 0) {
                lastPositions = linearLayoutManager.getItemCount();
                lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();

                if (lastPositions - 1 == lastVisibleItemPosition && isSlidingToLast) {
                    loadData(false);
                }
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            isSlidingToLast = dy > 0;
        }
    });

load data — это функция, которая получает новые данные для заполнения

person Canato    schedule 10.02.2018
comment
Спасибо, это решает мою проблему со стороны Android. Затем нужно будет реализовать loadData(), чтобы он выполнял вызов RESTful к моим внутренним службам, который запускал бы следующую загрузку. - person Mohamed Abulgasem; 16.02.2018