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版-新增推荐雷达歌单详情列表界面(十八)