【问题标题】:Getting notified when PagedList gets new dataPagedList 获取新数据时收到通知
【发布时间】:2019-02-01 06:10:35
【问题描述】:

我遇到了与这里的问题相同的问题: Not getting notified on PagedList updates

我所做的是为我的应用程序实现了分页库。 我加载了一个数据列表,它可能非常大。 Web 服务仅返回 20 个项目,并且使用密钥,您可以检索下 20 个项目,依此类推。 现在这很好用,适配器/回收器视图显示前 20 个项目。一旦我向下滚动,就会加载新项目。 问题是我需要知道何时加载新项目并需要对这些项目的引用。我需要将每个项目添加到列表顶部的地图视图中。如何通知我的分页列表中的更改? 我尝试使用“addWeakCallback”,但我似乎不明白它是如何工作的。 我希望每次加载数据时都会调用 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);
                        }
                    }
                };

视图模型

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

        }
    });
}

提前感谢您的帮助!

【问题讨论】:

    标签: android android-paging


    【解决方案1】:

    完成@Allinone51 的回答。这是一个如何声明 AdapterDataObserver 的示例:

    val defaultObserver = object : AdapterDataObserver() {
        override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
            super.onItemRangeInserted(positionStart, itemCount)
                //code here     
        }
    
        override fun onItemRangeRemoved(positionStart: Int, itemCount: Int) {
            super.onItemRangeRemoved(positionStart, itemCount)
                //code here    
        }
    
        //override fun onItemRangeChanged(positionStart: Int, itemCount: Int) 
        //override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) 
        //override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int)
        //override fun onChanged() 
    }
    
    adapter.registerAdapterDataObserver(defaultObserver)
    

    【讨论】:

      【解决方案2】:

      对于仍在搜索此问题的人,我设法找到了解决方案。 首先,您应该在 loadInitial、loadAfter 和 loadBefore 中同步加载数据。通过这样做,您的观察者将在正确的时间被调用。 另外,您还可以在适配器上添加一个侦听器:adapter.registerAdapterDataObserver() 通过同时使用这两种方法,我设法在将数据添加到我的 PagedList 时收到通知。

      【讨论】:

      • 您能否用代码和更好的解释详细说明您的答案。
      猜你喜欢
      • 1970-01-01
      • 2023-02-04
      • 2018-02-06
      • 2013-01-29
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多