【发布时间】: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