Получение уведомлений, когда PagedList получает новые данные - PullRequest
0 голосов
/ 26 августа 2018

У меня возникла такая же проблема, что и вопрос здесь: Не получаю уведомления об обновлениях PagedList

Я реализовал библиотеку подкачки для моего приложения.Я загружаю список данных, который может быть очень большим.Веб-сервис возвращает только 20 элементов, и с помощью ключа вы можете получить следующие 20 элементов и так далее.Теперь это прекрасно работает, адаптер / ресивер-просмотр показывают первые 20 пунктов.Как только я прокручиваю вниз, новые элементы загружаются.Проблема в том, что мне нужно знать, когда загружаются новые элементы, и нужна ссылка на эти элементы.Мне нужно добавить каждый элемент в представление карты в верхней части списка.Как я могу получать уведомления об изменениях в моем списке страниц?Я пытался использовать addWeakCallback, но я не понимаю, как это работает.Я ожидаю, что мой Observer на ViewModel будет вызываться каждый раз при загрузке данных, но мой наблюдатель запускается даже до загрузки данных.Наблюдатель запускается с пустым списком, и я просто отправляю этот список в мой PagedListAdapter.Может кто-нибудь, пожалуйста, уточнить все это?Что я могу сделать, чтобы наблюдать за изменениями данных в моем pagedList?

Вот код:

Наблюдатель

Observer<PagedList<Result>> resultObserver = new Observer<PagedList<Result>>() {
                    @Override
                    public void onChanged(@Nullable PagedList<Result> results) {
                        if (mResultAdapter == null) {
                            mResultAdapter= new ResultAdapter(getActivity());
                            mResultRecycler.setAdapter(mResultAdapter);
                            mResultAdapter.submitList(results);
                        }
                    }
                };

ViewModel

sourceFactory = new ResultDataSourceFactory(application.getApplicationContext());
PagedList.Config config = new PagedList.Config.Builder()
            .setEnablePlaceholders(false)
            .setPageSize(20)
            .setPrefetchDistance(5)
            .build();
resultList = new LivePagedListBuilder<>(sourceFactory, config).build();

Источник данных

@Override
public void loadInitial(@NonNull LoadInitialParams<String> params, @NonNull final LoadInitialCallback<Result> callback) {
    Webservices.loadSearchResponse(url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                Response response = parse(response)
                if (response != null) {
                    //Set search seed
                    searchSeed = response .getSearchSeed();
                    callback.onResult(response.getItemsList(), 0, 0);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
}

@Override
public void loadAfter(@NonNull LoadParams<String> params, @NonNull final LoadCallback<Response> callback) {
    Webservices.loadSearchResponse(url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                Result result = parse(response);
                if (result!= null) {
                    searchSeed = result.getSearchSeed();
                    callback.onResult(result.getItemsList());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
}

Заранее благодарен за помощь!

1 Ответ

0 голосов
/ 08 марта 2019

Для людей, которые все еще ищут это, мне удалось найти решение. Прежде всего, вы должны загрузить данные синхронно в loadInitial, loadAfter и loadBefore. При этом ваш наблюдатель будет вызван в нужное время. Кроме того, вы также можете добавить слушателя на свой адаптер: adapter.registerAdapterDataObserver() Используя оба, мне удалось получить уведомление, когда данные добавляются в мой PagedList.

...