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

Posted 雪の星空朝酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");

  解决:

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

解决recycleView暴力刷新数据问题

  问题代码:

  @SuppressLint("NotifyDataSetChanged")
    public void setDataList(List<HomeDiscoverEntity.DataEntity.BlocksEntity.CreativesEntity> data) 
        dataList.clear();
        dataList.addAll(data);
        notifyDataSetChanged();
    

解决

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

public class LikeAdapter extends RecyclerView.Adapter<LikeViewHolder> 

  修改继承为ListAdapter<Bean,ViewHolder>,如下:

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

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

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

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

public LikeAdapter(Context context) 
        super(new likeItemCallback());//根据提示添加这一行
        this.mContext = context;
    

  接下来,我们定义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()); //通过字段内容判断内容是否变化
    

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

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

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

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

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

likeAdapter.submitList(data);

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

以上是关于Android简易音乐重构MVVM Java版-使用DiffUtil解决recycleView整体数据刷新性能问题(二十二)的主要内容,如果未能解决你的问题,请参考以下文章

Android简易音乐重构MVVM Java版-新增启动动画

Android简易音乐重构MVVM Java版-新增推荐菜单及侧边栏展示

Android简易音乐重构MVVM Java版-BottomNavigationView+viewpager主界面结构

Android简易音乐重构MVVM Java版-新增推荐雷达歌单详情列表界面(十八)

Android简易音乐重构MVVM Java版-新增推荐雷达歌单详情列表界面(十八)

Android简易音乐重构MVVM Java版-新增歌曲播放界面+状态栏黑科技(十七)