RecyclerView 条目增删改的坑

作者: Hewitt | 来源:发表于2018-04-12 17:05 被阅读63次

    场景

    一般关于RecyclerView列表条目的增删改加动画的话 会考虑用itemAnimators
    recyclerView.setItemAnimator(new ScaleInLeftAnimator());
    adapter里会用到如下的几个方法:

    • notifyItemInserted(int position)
    • notifyItemRemoved(int position)
    • notifyItemRangeChanged(int positionStart, int itemCount)

    示例代码

        public void add(String text, int position) {
            mDataSet.add(position, text);
            notifyItemInserted(position);
        }
    
        public void remove(int position) {
            mDataSet.remove(position);
            notifyItemRemoved(position);
        }
    
        public void changeData(List<String> datas) {
            int len = mDataSet.size();
            if (!mDataSet.isEmpty()) {
                mDataSet.clear();
            }
            mDataSet.addAll(datas);
            notifyItemRangeChanged(0,datas.size());
        }
    

    坑在哪

    1. 假如在position=1的位置,插入/删除/一条数据,ui上没啥问题。但是!!!
      以add item举例,add后,原来positiom为1的item现在应该为2了,debug发现并没有,position还是1。
    2. notifyItemRangeChanged(0,datas.size()); 假如原本列表是50条数据,你批量替换数据为新的10条数据,不要直接这样用,这个方法只是item内容改变的时候用,不是完全替代notifyDataSetChanged();

    解决方案

        public void remove(int position) {
            mDataSet.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position,mDataSet.size()-position);
        }
    
        public void add(String text, int position) {
            mDataSet.add(position, text);
            notifyItemInserted(position);
            notifyItemRangeChanged(position,mDataSet.size()-position);
        }
    
        public void changeData(List<String> datas) {
            int len = mDataSet.size();
            if (!mDataSet.isEmpty()) {
                mDataSet.clear();
            }
            mDataSet.addAll(datas);
            notifyDataSetChanged();
           //notifyItemRangeChanged(0,datas.size());//内容改变的时候用
        }
    

    最后

    • 我没看源码,不是很懂google怎么想的,请懂的老铁指点迷津,比看源码快,万分感谢。
    • 问题: 假如列表切换新的数据,想有change动画,又想用setItemAnimator的动画方式,该怎么用notifyItemRangeChanged() ???
    • 写个帖子问题很多系列 哈哈哈

    相关文章

      网友评论

        本文标题:RecyclerView 条目增删改的坑

        本文链接:https://www.haomeiwen.com/subject/aecfkftx.html