私はここの質問と同じ問題を抱えています: 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) {
}
});
}
よろしくお願いします。