• Android简易音乐重构MVVM Java版-使用DiffUtil解决recycleView整体数据刷新性能问题(二十二)


    Android简易音乐重构MVVM Java版-使用DiffUtil解决recycleView整体数据刷新性能问题(二十二)

    关于

      因为最近项目原因,一些以前为了解决黄色警告的@SuppressLint("SimpleDateFormat")@SuppressLint("NotifyDataSetChanged")@SuppressLint("SetTextI18n")这些都要给它解决掉,然后就涉及到了recycleView之前直接简单的notifyDataSetChanged()就完事的坑。
      本人博客现在同步搬家到了掘金,里面还可以找到我的github主页,欢迎来访。
      最近一段时间在研究视频播放这一块,所以简易音乐的开发暂停一段时间,研究明白一点之后会在简易音乐里面开发视频模块。

    优化格式化日期警告问题

      问题:

        @SuppressLint("SimpleDateFormat")
        private DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    
    • 1
    • 2

      解决:

    private  DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.CHINESE);
    
    • 1

    解决recycleView暴力刷新数据问题

      问题代码:

      @SuppressLint("NotifyDataSetChanged")
        public void setDataList(List<HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity> data) {
            dataList.clear();
            dataList.addAll(data);
            notifyDataSetChanged();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    解决

      一般默认的recycleview的适配器是这样的:

    public class LikeAdapter extends RecyclerView.Adapter<LikeViewHolder> 
    
    • 1

      修改继承为ListAdapterViewHolder>,如下:

    public class LikeAdapter extends ListAdapter<HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity,LikeViewHolder>
    
    • 1

      其中HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity这个是实体类,对应以前写法如下:

    private final List<HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity> dataList = new ArrayList<>();
    
    • 1

      现在可以把这个datalist删掉了,然后LikeAdapter的构造器里面会有提示添加listadapter的容器

    public LikeAdapter(Context context) {
            super(new likeItemCallback());//根据提示添加这一行
            this.mContext = context;
        }
    
    • 1
    • 2
    • 3
    • 4

      接下来,我们定义likeItemCallback继承DiffUtil.ItemCallback:

    class likeItemCallback extends DiffUtil.ItemCallback<HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity>{
    
        @Override
        public boolean areItemsTheSame(@NonNull HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity oldItem, @NonNull HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity newItem) {
            return oldItem.getCreativeId().equals(newItem.getCreativeId()); //通过实体类里面的唯一字段来判断数据是否相同
        }
    
        @Override
        public boolean areContentsTheSame(@NonNull HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity oldItem, @NonNull HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity newItem) {
            return oldItem.getCreativeId().equals(newItem.getCreativeId()); //通过字段内容判断内容是否变化
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

      然后适配器里面的onBindViewHolder会报错,是因为我们把datalist删掉了:

    HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity bean = dataList.get(position);
    
    • 1

      修改为如下(使用getItem()来获取对应position数据):

    HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity bean = getItem(position);
    
    • 1

      然后我们删除getItemCount()
      修改调用新增数据方法的地方:

    likeAdapter.submitList(data);
    
    • 1

      DiffUtil会使用差异算法自动帮我们判断是局部刷新还是整体刷新。
      我们需要把项目中的涉及到的地方全部替换即可。
    如果recycleView有设置setHasFixedSize(true),这个也要删除。

  • 相关阅读:
    【树莓派不吃灰】搭建emqx MQTT Broker
    斯坦福机器学习 Lecture3
    ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用
    消息队列—RabbitMQ如何保证消息可靠性?
    背后的力量 | 搭建新型IT基础架构 华云数据助力妇幼保健院提升数字化医院建设水平
    《C++ Primer Plus》第九章:内存模型和名称空间(1)
    中台建设:中台有效落地的6脉神剑
    QT学习之QT概述
    【golang学习之旅】Go中的变量——基本数据类型(1)
    Linux-新建用户/群组以及修改文件权限
  • 原文地址:https://blog.csdn.net/Tobey_r1/article/details/126164327