• 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),这个也要删除。

  • 相关阅读:
    《元宇宙工程》南京首发 落地实用是关键
    领域驱动设计
    如何快速发表一篇SCI论文
    自定义springboot-start
    腾讯云轻量应用服务器部署(新手图文教程)
    IDEA2022.1创建maven项目,规避idea2022新建maven项目卡死,无反应问题
    使用 nohup 运行 Python 脚本
    es示例。。。
    for、while、do While、for in、forEach、map、reduce、every、some、filter的使用
    Maven 依赖管理
  • 原文地址:https://blog.csdn.net/Tobey_r1/article/details/126164327