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