【问题标题】:RecyclerView.Adapter notifyDataSetChanged() not working when is showing last itemRecyclerView.Adapter notifyDataSetChanged() 在显示最后一项时不起作用
【发布时间】:2015-07-02 22:15:02
【问题描述】:

我正在为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() 不起作用。只有当我再次上下滚动以强制呈现新数据时,才会显示这些新数据。

知道哪里出了问题吗?

【问题讨论】:

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


    【解决方案1】:

    你可以试试

            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 我没有像你这样的问题

    您使用哪些库?

    我的是:

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

    【讨论】:

    • 这是什么?你想在这里做什么?
    • 我已经在处理滚动监听了。上面的代码是在 onScrolled 方法中完成的例程的一部分。我正确检测到何时必须下载新数据。我的问题出在 notifyDataSetChanged() 中,有时会失败(当最后一项在视图中时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多