RecyclerView — DiffUtil

RecyclerView — DiffUtil,第1张

DiffUtil 16年出来的,是为了我饿们你在更新列表数据时可以实现动画效果

样子是这样的:

基础部分我就不写了,大家看这里就行,写的挺清楚:

本文例子:

接下来我就来说说注意事项

DiffUtil 想出动画效果,必须给 RecyclerView 添加 item 动画,item 动画的默认是先类是 DefaultItemAnimator,并且 add,remove,update,move可以分贝设置时间

默认的 item 动画一般,推荐大家自己去做自己的效果

我这里为了明显,每个动画是 3秒

DiffUtil 动画的执行顺序:

我们只有知道自己的数据怎么变化,才能猜测出动画执行的轮廓,然后调整不是

DiffUtil 对对比新旧2个集合对应 position 位置 item

areItemsTheSame 需要特别注意,areItemsTheSame 书写不正当,非常容易触发系统 bug

这个 bug 是系统抛出来的,无解,我们处理不了, 根本原因在于 areItemsTheSame 我们没处理好

areItemsTheSame 方法的目的是:判断新旧2个列表相同 positon 位置的 item 是否是同一个,这个不光是判断 item 是不是同一个 itemtype,更要判断这个 item 的身份是不是同一个,就好比时同一个人,比如这个人的衣服,前一分钟是绿色的,然后变成了红色,目的就是这样,看是不是同一个 item, 同一个 item 有可能默写数据有变化,我们在 areContentsTheSame 方法再去判断数据是不是有变化,有变化更新数据

我的例子是这样写的:

我的列表里有2种 itemtype ,之前只判断了 itemtype 是不是一样,结果频繁报 IndexOutOfBoundsException 这个异常,搞了半天想死的心都有,最后还是再次品鉴了翻 areItemsTheSame 方法的意义才 OK 的,大家这里碰到同样的问题,请不要着急,按我的思路求做,一准没问题

这几天熟悉了RecyclerView的使用以及内部动画机制,有几篇文章做备忘:

RecyclerView本身对添加动画和删除动画支持的很好,但首次加载自定义起来并不容易。目前看来主流的方法:

当Adapter触发 notifyItemRangeInserted()或者notifyItemInserted()的时候, 这个 RecyclerView.ItemAnimator的animateAdd方法将被调用。

其中AnimationItem对应的是对话对应的资源文件,比如从右侧延迟滑动滚入的动画xml,对应的item动画如下:

item_animation_from_right.xml

layoutAnimation如下:

第四种方法参考文章 Enter animation using RecyclerView and LayoutAnimation Part 1: Lists

个人觉得四中方法还是最后一种方法简单方便。

gridview你要用自定义的适配器 然后用gridview.setItemClickListener 即注册条目点击事件 点击的时候,获取当前点击的是哪一行 然后去adapter中删除这一行数据 再调用 adapter.notifydatasetchanged


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11513291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存