RecyclerView.Adapter 显示最后一项时 notifyDataSetChanged() 不工作

RecyclerView.Adapter notifyDataSetChanged() not working when is showing last item

我正在为 RecyclerView 实施无限数据加载。当软件检测到最后一个项目将要显示时,它会下载新项目并调用以下函数(运行 它在主线程中):

int visibleItemCount = numberOfItemsPerRow;
int pastVisiblesItems = ((GridLayoutManager)recyclerView.getLayoutManager()).findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
if (loading) {
    if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) {
    .
    .
    .

    //After downloading data

    loading = false;
    getActivity().runOnUiThread(new Runnable() {
        public  void  run() {
            mAdapter.notifyDataSetChanged();
        }
    });
}

但是,如果我快速滚动并且在接收新数据之前显示最后一项,notifyDataSetChanged() 将不起作用。仅当我再次上下滚动以强制呈现新数据时,才会显示这些新数据。

知道哪里出了问题吗?

你可以试试:

        RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
                super.onScrolled(recyclerView, dx, dy);
            }
        });

编辑:

为了您使用它来确定您使用的正确位置, 我打赌你的立场没有反映出合适的条件:

  • 当视图为空时,最后可见位置将为 -1
  • 当视图获得一个元素时,位置将为0
  • 适配器数量将为 1

编辑 2:

我有类似的方法:

  • 在队列中保存数据的搜索线程
  • 按需清空队列
  • 我有适配器

    public class MyAdapter extends RecyclerView.Adapter<ItemCardAdapter.ViewHolder>

  • 在适配器中我得到了一个列表:

    List<T> _itemList;

    • 我有方法 add(item)/addAll(collection)/clear() 来管理项目列表

    • 三个重写方法:

      @Override public int getItemCount() { return _itemList.size(); }

      @Override public void onBindViewHolder(ViewHolder holder, int position) { }

      @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {}

  • 持有人:

    public class ViewHolder extends RecyclerView.ViewHolder {}

  • 我通过 Adapter.add();clear(); 管理数据,然后我在 UI 线程上调用 Adapter.notifidatasetChanged(); 作为 Runnable 我没有遇到类似的问题你

您使用哪些库?

我的是:

  • appcompat-v7:22.2.0'
  • 支持-v4:22.2.0'
  • 设计:22.2.0'
  • recyclerview-v7:22.2.0'
  • cardview-v7:22.2.0'