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

Ser*_*kii 5 android

我有以下 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'

    }

}
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,我在方法中设置数据setData,然后将数据传递到 diffutil,在那里进行计算。但随后我需要删除differ适配器中列表的一个元素。为此,我创建了 method 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)
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*elt 7

您必须保留原始数据的副本,从那里删除该项目,然后调用differ.submitList. DiffUtils将为您完成剩下的工作