【问题标题】:Updating FireStore Recycler Adapter on Button Click在按钮单击时更新 FireStore Recycler 适配器
【发布时间】:2021-08-11 10:53:56
【问题描述】:

我使用 Firestore 作为我的数据库,并使用 Firestore Recycler Adapter 来显示我的 Firestore 数据库中的数据。

我的 Recyclerview 在启动我的应用程序时显示准确的数据,但是当我单击添加按钮时出现问题,这会清除我的回收器视图中的数据。

这是 ItemAdapter.kt

package com.fangs.inventory_management_system.adapter

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.fangs.inventory_management_system.R
import com.fangs.inventory_management_system.model.ItemModel
import com.firebase.ui.firestore.FirestoreRecyclerAdapter
import com.firebase.ui.firestore.FirestoreRecyclerOptions
import kotlinx.android.synthetic.main.item_layout.view.*

class ItemAdapter (option : FirestoreRecyclerOptions<ItemModel>) : FirestoreRecyclerAdapter<ItemModel, ItemAdapter.ViewHolder>(option) {


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

        return ViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
        )

    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int, model: ItemModel) {

        holder.itemName.text = model.itemName
        holder.itemQuantity.text = model.itemQuantity.toString()

    }

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

        val itemName: TextView = itemView.tv_item_name
        val itemQuantity: TextView = itemView.tv_item_quantity
    }
}

这是我的 MainActivity.kt

package com.fangs.inventory_management_system.activity

import android.app.AlertDialog
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.fangs.inventory_management_system.R
import com.fangs.inventory_management_system.adapter.ItemAdapter
import com.fangs.inventory_management_system.model.ItemModel
import com.firebase.ui.firestore.FirestoreRecyclerOptions
import com.google.android.material.textfield.TextInputEditText
import com.google.firebase.auth.ktx.auth
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.Query
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private var adapter : ItemAdapter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val userID = Firebase.auth.currentUser!!.uid

        updateRecyclerView()


        //get instance of Firestore db
        val db = Firebase.firestore
        val infoRef = db.collection("user").document(userID).collection("profile").document("info")
        infoRef.get()
            .addOnSuccessListener {document ->
                if(document != null){
                    //get the data as cast to hashmap
                    val data = document.data as HashMap<*, *>
                    //get the username field and set text for greet user as the same value inside firestore
                    val username = data["username"] as String
                    tv_greet_user.text = "Hello, $username"
                }
            }


        //add items in recycler view

        btn_add.setOnClickListener {

            addItem()
            updateRecyclerView()

        }

    }

    private fun updateRecyclerView() {

        //get root reference
        val root = FirebaseFirestore.getInstance()
        val query = root!!.collection("item").orderBy("itemName", Query.Direction.ASCENDING)
        val options = FirestoreRecyclerOptions.Builder<ItemModel>().setQuery(query, ItemModel::class.java).build()

        rv_items.layoutManager = LinearLayoutManager(this)
        adapter = ItemAdapter(options)
        rv_items.adapter = adapter



    }

    private fun addItem() {

        //alert dialog
        val dialog = AlertDialog.Builder(this)
        val layout = layoutInflater.inflate(R.layout.add_item_dialog, null)

        val itemName = layout.findViewById<TextInputEditText>(R.id.et_item_name)
        val itemQuantity = layout.findViewById<TextInputEditText>(R.id.et_item_quantity)

        dialog.setTitle("New Item Info")
        dialog.setCancelable(false)
        dialog.setView(layout)

        dialog.setPositiveButton("Add"){_,_ ->

            val newItem = ItemModel(itemName = itemName.text.toString(), itemQuantity = itemQuantity.text.toString().toInt())

            //open Firestore db
            val db = Firebase.firestore
            val collectionRef = db.collection("item")
            collectionRef.add(newItem)

        }

        dialog.setNegativeButton("Cancel") {dialogInterface, _ ->
            dialogInterface.dismiss()
        }

        dialog.show()

    }

    override fun onStart() {
        super.onStart()
        adapter!!.startListening()
    }

    override fun onStop() {
        super.onStop()
        adapter!!.stopListening()
    }
}

此错误不会使我的应用程序崩溃。但是添加新项目时数据无法显示。 当我重新启动我的应用程序时,它会显示所有数据。

【问题讨论】:

  • 您是否尝试将侦听器附加到.add(newItem) 操作以查看是否有问题?
  • 您好,先生,谢谢您的回复。我尝试添加侦听器以检查数据是否按照您所说的正确保存,并且似乎没有任何问题。在查看我的代码后,我发现更新按钮内的 Recycler View 是问题所在。我删除了它,数据现在相应地显示。谢谢!

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

这个区块

btn_add.setOnClickListener {

            addItem()
            updateRecyclerView()

        }

这似乎是该错误的根本原因。我删除了 updateRecyclerView() 并修复了错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多