6

私はここの質問と同じ問題を抱えています: PagedList の更新について通知を受けていません

私がしたことは、アプリケーションのページング ライブラリを実装することです。非常に大きくなる可能性があるデータのリストをロードします。Web サービスは 20 項目のみを返し、キーを使用して次の 20 項目を取得できます。これで問題なく動作し、アダプタ/リサイクラー ビューには最初の 20 項目が表示されます。下にスクロールすると、新しいアイテムが読み込まれます。問題は、新しいアイテムがいつ読み込まれるかを知る必要があり、それらのアイテムへの参照が必要なことです。リストの上にあるマップ ビューに各アイテムを追加する必要があります。pagedlist の変更を通知するにはどうすればよいですか? 「addWeakCallback」を使用してみましたが、それがどのように機能するかを理解していないようです。データが読み込まれるたびに ViewModel の Observer が呼び出されることを期待しますが、データが読み込まれる前でも Observer がトリガーされます。オブザーバーは空のリストでトリガーされ、そのリストを 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);
                        }
                    }
                };

ビューモデル

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) {

        }
    });
}

よろしくお願いします。

4

2 に答える 2