【问题标题】:Clear list before asking for more data from Firebase Realtime Database在从 Firebase 实时数据库请求更多数据之前清除列表
【发布时间】:2020-04-20 17:27:32
【问题描述】:

我在recyclerview 中有一个点击监听器,我希望在此基础上更新列表。就像如果我点击一个按钮,列表应该用内容更新,当用户再次点击按钮时,我希望列表中的数据为空,然后用所需的数据填充它。我能够在没有Firebasechildeventlistener 功能的情况下实现上述目标,但是通过启用ChildEventListener,我发现很难实现这个概念。 代码如下。

片段如下


The ViewModel which assigns data to the adapter
 viewModel.productdetail.observe(viewLifecycleOwner, Observer {
            adapter.adddetails(it)
        })


  // The onClickListener which on clicked gets data from Firebase
    override fun recyclerViewItemClickedHorizontal(view: View, text: String) {
        when (view.id) {
            R.id.card_hor -> {
                viewModel.productsdetails(text)
                viewModel.fetchtotal(text)

            }
        }
    }

视图模型


   fun productsdetails(productname: String) {
    // I had tried to set the additems.clear here but it didn't work
        dbadd.child(productname).addChildEventListener(productchildlistener)
    }


    private val productchildlistener = object : ChildEventListener {
        override fun onCancelled(error: DatabaseError) {}

        override fun onChildMoved(snapshot: DataSnapshot, p1: String?) {}

        override fun onChildChanged(snapshot: DataSnapshot, p1: String?) {
            val products = snapshot.getValue(AddModel::class.java)
            products?.id = snapshot.key
            _productdetail.value = products
        }

        override fun onChildAdded(snapshot: DataSnapshot, p1: String?) {
            val products = snapshot.getValue(AddModel::class.java)
            products?.id = snapshot.key
            _productdetail.value = products
        }

        override fun onChildRemoved(snapshot: DataSnapshot) {

        }
    }
}

适配器

 private var additems = mutableListOf<AddModel>()


  // This functions assigns the data to the list
    fun adddetails(addmodel:AddModel) {


        additems.add(addmodel)
        notifyDataSetChanged()

    }

这就是我尝试在没有 CHILDEVENTLISTENER 的情况下实现它的方式


      fun productsdetails(productname: String) {

          dbadd.child(productname).addListenerForSingleValueEvent(object : ValueEventListener {
              override fun onCancelled(error: DatabaseError) {}

              override fun onDataChange(snapshot: DataSnapshot) {
                  if (snapshot.exists()) {
                      val additems = mutableListOf<AddModel>()
                      additems.clear()
                      for (products in snapshot.children) {

                          val product = products.getValue(AddModel::class.java)
                          product?.id = products.key
                          product?.let { additems.add(it) }
                      }
                      _productdetail.value = additems

                  }
              }
          })

      }

在执行上述操作时,我必须将 LiveData 分配为 > 然后将列表提供给适配器以完成需要。 谢谢你的帮助

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database android-recyclerview


    【解决方案1】:

    每次触发

    override fun onChildChanged(snapshot: DataSnapshot, p1: String?) { ... }
    

    您已经有了要再次填充列表的快照值,您可以清除 onChildChanged 中的列表,读取新的更新值,然后将该列表再次发送到您的适配器并通知新数据,这样您将始终拥有新鲜的数据列表中的数据。

    【讨论】:

    • 它是如何增加的?
    • 列表与上一个添加了新数据。
    • 感谢您的帮助。我们将不胜感激。
    • 如果它在清除列表中添加了新数据,您没有清除列表正确,您使用什么清除旅游列表?应该是 yourlist.clear()
    • 有什么特殊的调用列表的方法吗?
    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2016-06-04
    • 2021-06-04
    相关资源
    最近更新 更多