Recyclerview 适配器 onBindViewHolder 负载不工作

Recyclerview adapter onBindViewHolder payload is not working

所有的例子我都检查过了,但终究还是不行。据我所知,即使payload是'List',String或Int值也可以进去。

class RecordListAdapter (val context: Context, val layoutManager: LinearLayoutManager, private val canBeEdited: Boolean)
    : RecyclerView.Adapter<RecordListAdapter.RecordViewHolder>() {

    private val inflater: LayoutInflater = LayoutInflater.from(context)
    private var records: ArrayList<Record> = arrayListOf()

    // Update ALL VIEW holder
    override fun onBindViewHolder(holder: RecordViewHolder, position: Int) {
        val current = records[position]

        holder.autoCompleteTextView.text = SpannableStringBuilder(current.name)
        holder.weightPicker.value = current.weight
        holder.setPicker.value = current.set
        holder.repsPicker.value = current.reps

        if(position == itemCount - 1) holder.addBtn.visibility = View.VISIBLE
        else holder.addBtn.visibility = View.GONE

        if(canBeEdited) {
            if(itemCount == 1) {
                holder.deleteBtn.visibility = View.GONE
            } else {
                holder.deleteBtn.visibility = View.VISIBLE
                holder.deleteBtn.setOnClickListener {
                    records.remove(current)
                    notifyItemRemoved(position)
                }
            }
        } else
            holder.deleteBtn.visibility = View.GONE
    }

    // Update only part of ViewHolder that you are interested in
    override fun onBindViewHolder(holder: RecordViewHolder, position: Int, payloads: MutableList<Any>) {
        Log.e("payload", "::$payloads")
        if(payloads.isNotEmpty()) {
        } else
            super.onBindViewHolder(holder,position, payloads)
    }

    private fun addRecordDefault() {
        this.records.add(Record("", 28, 5, 10))
        notifyItemInserted(itemCount)
        notifyItemRangeChanged(itemCount-1, 2, "PAYLOAD_ADD_BTN")
    }

    override fun getItemCount() = records.size
}

如上代码,我设置了Log.e来判断该值是否为空。负载 Log.e 总是说它是空的。

E/payload: ::[]

首先,您似乎只是在添加项目并想立即使用有效负载更改其中的内容。
显然,当你只是添加一个新的时,整个项目必须被绘制,因此不需要有效负载。
只有这样,当它已经绘制并且您想要更改某些元素时,您可以使用带有 notifyItemChanged(如果更改了一项)或 notifyItemRangeChanged(如果更改了多项)的有效负载。

其次,我不确定你使用的范围。
notifyItemRangeChanged 的第一个参数是起始索引。
第二个是你要改变多少项目。

第三,不清楚你在哪里调用 addRecordDefault 因此,请确保您使用有效负载调用了 notifyItemChanged 或 notifyItemRangeChanged。