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。
所有的例子我都检查过了,但终究还是不行。据我所知,即使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。