gpt4 book ai didi

android - 如何从使用 diffutil 的 recyclerview 中删除项目?

转载 作者:行者123 更新时间:2023-12-04 02:35:15 25 4
gpt4 key购买 nike

我有以下 recyclerview 适配器:

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.add_new_card_list_item.view.*
import kotlinx.android.synthetic.main.bank_card_list_item.view.*
import kz.moneyman.R

class BankCardsAdapter(
private val onDeleteCardClickListener: OnDeleteCardClickListener,
private val onAddCardClickListener: OnAddCardClickListener
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private var checkedItem = 0
private val differ = AsyncListDiffer(this, BankCardsDiffUtilCallback())

override fun getItemViewType(position: Int): Int {
if (differ.currentList[position].isNotEmpty()) {
return R.layout.bank_card_list_item
}
return R.layout.add_new_card_list_item
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(viewType, parent, false)

return if (viewType == R.layout.bank_card_list_item) {
BankCardViewHolder(itemView)
} else {
AddNewCardViewHolder(itemView)
}
}

override fun getItemCount(): Int {
return differ.currentList.size
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (differ.currentList[position].isNotEmpty()) {
(holder as BankCardViewHolder).bindData(differ.currentList[position], onDeleteCardClickListener)
} else {
(holder as AddNewCardViewHolder).bindData(onAddCardClickListener)
}
}

fun setData(cardNumbers: ArrayList<String>) {
differ.submitList(cardNumbers)
}

fun deleteElement(position: Int) {
differ.currentList.removeAt(position)
notifyDataSetChanged()
}

interface OnDeleteCardClickListener {
fun onDeleteCardClicked(position: Int, value: String)
}

interface OnAddCardClickListener {
fun onAddCardClicked()
}

inner class BankCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

fun bindData(value: String, onDeleteCardClickListener: OnDeleteCardClickListener) {

itemView.card_number_tv.text = value
itemView.card_firm_iv.setImageResource(if (value[0] == VISA_START_SYMBOL) R.drawable.ic_visa else R.drawable.mastercard)

itemView.delete_card_tv.setOnClickListener {

if (adapterPosition != RecyclerView.NO_POSITION) {
onDeleteCardClickListener.onDeleteCardClicked(adapterPosition, value)
}

}

itemView.bank_card_rb.setOnCheckedChangeListener(null)

itemView.bank_card_rb.isChecked = checkedItem == adapterPosition
itemView.bank_card_rb.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
checkedItem = adapterPosition
notifyDataSetChanged()
}
}

itemView.bank_card_cl.setOnClickListener {
checkedItem = adapterPosition
notifyDataSetChanged()
}


}

}

inner class AddNewCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

fun bindData(onAddCardClickListener: OnAddCardClickListener) {

itemView.online_add_card_tv.setOnClickListener {

if (adapterPosition != RecyclerView.NO_POSITION) {
onAddCardClickListener.onAddCardClicked()
}

}

}

}

companion object {

private const val VISA_START_SYMBOL = '4'
private const val MASTERCARD_START_SYMBOL = '3'

}

}

因此,如您所见,我在方法 setData 中设置数据然后将数据传递给 diffutil,在那里进行计算。但是我需要删除 differ 的一个元素在适配器中列出。为此,我创建了方法 deleteElement ,它删除位置的元素。但是当我运行该应用程序时,我发现了以下异常:
java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableList.remove(Collections.java:1359)
at views.adapters.BankCardsAdapter.deleteElement(BankCardsAdapter.kt:54)
at TestStepFragment$onViewCreated$1.onDeleteCardClicked(TestStepFragment.kt:36)
at BankCardsAdapter$BankCardViewHolder$bindData$1.onClick(BankCardsAdapter.kt:76)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

据我了解,问题是differ.currentList 是不可变列表,但我该如何解决这个问题?

最佳答案

您必须保留原始数据的副本,从那里删除项目,然后调用 differ.submitList . DiffUtils剩下的会为你做

关于android - 如何从使用 diffutil 的 recyclerview 中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62256726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com