RecyclerView.Adapter notifyDataSetChanged()在显示最后一项时不起作用

时间:2015-07-02 22:15:02

标签: android android-recyclerview custom-adapter notifydatasetchanged gridlayoutmanager

我正在为$pizza = "05.500"; $pieces = explode(".", $pizza); echo $pieces[0]; echo '/'; echo $pieces[1]; 实施无休止的数据加载。当软件检测到要显示的最后一个项目时,它会下载新项目并调用以下函数(在主线程中运行它):

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(); } }); } 不起作用。只有当我再次向上和向下滚动时,为了强制渲染新数据,才会显示这些新数据。

对于什么是错误的任何想法?

1 个答案:

答案 0 :(得分:0)

您可以尝试

        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();管理数据,然后我将Adapter.notifidatasetChanged();称为UI线程上的Runnable我没有像您这样的问题

    < / LI>

您使用哪些库?

我是:

  • 程序兼容性-V7:22.2.0&#39;
  • 支持-V4:22.2.0&#39;
  • 设计:22.2.0&#39;
  • recyclerview-V7:22.2.0&#39;
  • cardview-V7:22.2.0&#39;