需要解释为什么RecyclerView.Adapter.notifyItemChanged(int position,Object payload)和我绑定有效负载参数是对象列表

时间:2016-12-15 20:00:34

标签: android android-recyclerview

RecyclerView.Adapter.notifyItemChanged(int position,Object payload),其中payload是一个任意对象,将传递给RecyclerView.Adapter.onBindViewHolder(VH holder,int position,List payloads)

那么为什么如果我不能传递项目上的1个对象,那么为什么在bind方法中传递的有效负载列表会被更改?

2 个答案:

答案 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)
}