我遇到的问题与这里的问题相同: Not getting notified on PagedList updates
我所做的是为应用程序实现了分页库。 我加载的数据列表可能很大。该Web服务仅返回20个项目,并带有一个密钥,您可以检索下20个项目,依此类推。 现在效果很好,adapter / recyclerview显示了前20个项目。向下滚动后,将加载新项目。 问题是我需要知道何时加载新项目并需要对这些项目的引用。我需要将每个项目添加到列表顶部的地图视图中。如何通知我的页面列表中的更改? 我尝试使用“ addWeakCallback”,但我似乎不明白它是如何工作的。 我希望每次加载数据时都会调用ViewModel上的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);
}
}
};
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) {
}
});
}
在此先感谢您的帮助!
答案 0 :(得分:0)
对于仍在搜索此内容的人们,我设法找到了解决方案。
首先,您应该在loadInitial,loadAfter和loadBefore中同步加载数据。这样,您的观察员将在适当的时间被召唤。
另外,您还可以在适配器上添加侦听器:adapter.registerAdapterDataObserver()
通过使用两者,我设法在将数据添加到我的PagedList时得到通知。