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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值