RecyclerView.Adapter.notifyItemChanged(int position,Object payload),其中payload是一个任意对象,将传递给RecyclerView.Adapter.onBindViewHolder(VH holder,int position,List payloads)
那么为什么如果我不能传递项目上的1个对象,那么为什么在bind方法中传递的有效负载列表会被更改?
答案 0 :(得分:0)
嗯,在回收站视图中有一个部分和完全绑定的概念。这是Android开发者网站关于onBindViewHolder方法所说的内容:
payloads参数是来自notifyItemChanged的合并列表(int, Object)或notifyItemRangeChanged(int,int,Object)。如果有效载荷 list不为空,ViewHolder当前绑定到旧数据和 适配器可以使用有效负载信息运行有效的部分更新。如果 有效负载为空,适配器必须运行完全绑定。适配器不应该 假设将通过通知方法传递的有效负载 onBindViewHolder()。例如,视图未附加到 屏幕,notifyItemChange()中的有效负载将被简单地删除。
阅读本文将有助于: onBindViewHolder - Android Developers
答案 1 :(得分:0)
您还可以将有效负载与DiffUtils或notifyItemChanged(int position, @Nullable Object payload)
一起使用
成为列表的Object
/ Any
类的有效负载点,取决于您使用的方案,它们具有不同种类的对象。
例如,假设您的回收站视图项目包含图像,标题(以字符串形式)和价格(以数字形式)或其他任何值(视情况而定)。
如果在没有有效负载的情况下调用onBindViewHolder
时数据中的某些字段发生了变化,并且您的图像很大,则会闪烁,这会打扰用户。
您可以根据更改的数据来检查并发送有效负载。 如果仅标题已更改,则在此列表中放置一个字符串;如果数字已更改,则可以将Int置于list [0]。如果两者都更改,则可以将标题添加到列表[0],将价格添加到列表[1],然后检查这种情况。 String和Int是简单变量,不需要发送Int而不是String,但是出于参数的考虑,有效载荷中可以包含不同的项目。
override fun onBindViewHolder(
holder: CustomViewHolder<CurrencyRateEntity>,
position: Int,
payloads: MutableList<Any>
) {
if (payloads.isNullOrEmpty()) {
// Set item binding as whole since no payload
binding.setVariable(BR.item, item)
binding.executePendingBindings()
} else {
when (val payload = payloads[0]) {
is String -> {
title.setText = payloads[0]
}
is Int -> {
// do something with int
price.text = "${payload / 1000}"
}
}
}
super.onBindViewHolder(holder, position, payloads)
}