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

  • 相关阅读:
    Zabbix Timeout 设置不当导致的问题
    【vue实战项目】通用管理系统:作业列表
    C++面试记录之中望软件
    Vue3入门
    rocketmq发送消息底层分析
    LiteFlow 流程引擎
    【Proteus仿真】【Arduino单片机】HC05蓝牙通信
    CSS盒子模型及属性
    C++类的一些注意事项
    程序员缓解工作压力的一些方法
  • 原文地址:https://blog.csdn.net/Tobey_r1/article/details/126164327