【问题标题】:Notifydatasetchanged, dialogs and view bindingNotifydatasetchanged、对话框和视图绑定
【发布时间】:2022-10-16 03:49:19
【问题描述】:

设想

最近从合成转向视图绑定,我仍在苦苦挣扎(几个月没有做任何编码,所以我生锈了)。

MainActivity 有两个recyclerview,一个显示总计,一个显示交易列表。每个事务都有一个附加的“OnLongClickListener”(附加在适配器类中)。此侦听器调用具有两个选项的 MaterialAlertDialog:编辑或删除。 还有一个单独的片段用于添加事务。

要求

在添加、删除或修改这些事务时,两个回收适配器都需要刷新数据,以便在屏幕上反映正确的信息。

问题

我无法让适配器接收“notifydatasetchanged”,因为我不确定如何获取适配器的参考。

正在使用的代码

主要活动

    private val db = FirebaseFirestore.getInstance()
    private val dbSettings = firestoreSettings { isPersistenceEnabled = true }
        
    CoroutineScope(Dispatchers.Default).launch {
        val adapterRV1 = Adapter_RV1(FSDB.Get_calculations, FSDB.Get_transactions(db))
        val adapterRV2 = Adapter_RV2(FSDB.Get_transactions(db))

        runOnUiThread {
            binding.rvCalculations.adapter = adapterRV1
            binding.rvTransactions.adapter = adapterRV2
        }
    }

适配器_RV1

class Adapter_RV1(val calculations_list: List<calculation>,val transactions_list: ArrayList<Transactions>) : RecyclerView.Adapter<Adapter_RV1.CalculationViewHolder>() {

    private lateinit var binding: RvCalculationsLayoutBinding

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter_RV1.CalculationViewHolder {
        val binding = RvCalculationsLayoutBinding
            .inflate(LayoutInflater.from(parent.context), parent, false)
        return CalculationViewHolder(binding)
    }

    override fun onBindViewHolder(holder: KPIViewHolder, position: Int) {

        with(holder) {
            with(calculations_list[position]) {
            ...
            }
        }
    }

    override fun getItemCount() = calculations_list.size

    inner class CalculationViewHolder(val binding: RvCalculationsLayoutBinding) :
        RecyclerView.ViewHolder(binding.root)
}

适配器_RV2

class Adapter_RV2(var transactions_list: List<Transaction>):
    RecyclerView.Adapter<Adapter_RV2.TransactionsViewHolder>() {

    private lateinit var binding: RvTransactionsLayoutBinding

    inner class TransactionsViewHolder(val binding: RvTransactionsLayoutBinding) : RecyclerView.ViewHolder(binding.root){

        init {
            binding.root.setOnLongClickListener {
                val position = absoluteAdapterPosition
                val item = transactions_list[position]

                CoroutineScope(Dispatchers.Main).launch {
                    CreateDialog(item,position,binding)
                }

                true
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter_RV2.TransactionsViewHolder {
        val binding = RvTransactionsLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return TransactionsViewHolder(binding)
    }

    override fun onBindViewHolder(holder: TransactionsViewHolder, position: Int) {
        ...
    }

    override fun getItemCount() = transactions_list.size
}

创建对话框

class CreateDialog (transaction: Transaccion, position: Int, binding: RvVistaTransaccionesBinding){

    private suspend fun DeleteTransaction(position: Int) {
        ...
        traRef.update("transactions", FieldValue.arrayRemove(transaction)).await()
    }

    private val puBinding : PopupLayoutBinding = PopupLayoutBinding.inflate(LayoutInflater.from(binding.root.context))

    init {
        with(puBinding){
            ...
            CoroutineScope(Dispatchers.Main).launch {
                supervisorScope {
                    val task = async {
                        DeleteTransaction(position)
                    }
                    try{
                        task.await()
                        /// This is where, I guess, adapters should be notified of dataset changes
                        popup.dismiss()
                    }
                    catch (e: Throwable){
                        crashy.recordException(e)
                        Log.d("Transaction",e.message!!)
                        popup.dismiss()
                    }
                }
            }
        }
    }

    popup.setView(puBinding.root)
    popup.show()
}

到目前为止我测试过的

老实说,我不知道如何进行。我已经尝试了一些东西,但都没有奏效,考虑到我在 Dev 中总体上是超级绿色的,View Binding 比平时更令人困惑。

【问题讨论】:

  • 这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?
  • 根据我的尝试,我遇到了一些错误。基本上,我不确定“notifydatasetchanged”会去哪里以便让它更新 MainActivity 中的 recyclerviews。我尝试在 MainActivity 中创建一个函数,但没有适配器引用它什么也不做。我尝试在适配器中设置函数,但我得到“无法在未调用 Looper.prepare() 的线程 Thread[DefaultDispatcher-worker-1,5,main] 内创建处理程序”。我的问题是,使用合成器要容易得多,因为我可以直接引用适配器,现在我不知道如何使它工作。

标签: android firebase kotlin android-recyclerview android-viewbinding


【解决方案1】:

我已经替换了下面的行

notifyDataSetChanged();

binding.recycler.getAdapter().notifyDataSetChanged();

这里,“recycler”是我的RecyclerView,“binding”是Activity List Binding。

我没有阅读您的代码,也许我的提示会对您有所帮助,它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2012-05-25
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多