【问题标题】:Display data from Firebase Firestore to RecyclerView with KOTLIN [closed]使用 KOTLIN 将数据从 Firebase Firestore 显示到 RecyclerView [关闭]
【发布时间】:2019-01-15 17:06:42
【问题描述】:

我有一个正在工作的项目,我使用 Firebase Firestore。我已将 mysql 数据库中的 125 个项目添加到 Cloud firestore。我在网上搜索了 Firebase presentation 以获取信息,但由于某种原因它对我没有帮助。我看到了 web、swift、c 和 php,但我看不到 KOTLIN 的代码。但是经过 3 天的工作,我在 logcat 中显示了项目。另一个问题是,我搜索了演示文稿,stackoverflow 没有指示如何在RecyclerView 中显示数据。如何使用 KOTLIN 向RecyclerView 显示项目?

我想知道如何用 Kotlin 做到这一点。

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    我从你的问题中了解到,你已经成功地在你的 logcat 中显示了这些项目,对吧?因此,在这种情况下,您还需要执行两个步骤才能在 RecyclerView 中显示数据。

    第一步是创建一个自定义适配器,或者如果您愿意,您可以使用FirestoreRecyclerAdapter,第二步是为您的项目创建一个支架类。最后,只需将适配器设置为您的 RecyclerView 即可。

    添加的解决方案:

    对于 Java 开发人员,this 是一种推荐的方式,您可以通过这种方式从 Cloud Firestore 数据库中检索数据并使用 FirestoreRecyclerAdapter 将其显示在 RecyclerView 中。

    对于 Kotlin 开发人员,我将改编上面示例中的代码。假设您的 Firestore 数据库结构如下所示:

    Firestore-root
        |
        --- products (collection)
               |
               --- documentIdOne (document)
               |        |
               |        --- productName: "Milk"
               |
               --- documentIdTwo (document)
               |        |
               |        --- productName: "Soy Milk"
               |
               --- documentIdThree (document)
                        |
                        --- productName: "Bacon"
    

    一个看起来也像这样的模型类:

    class ProductModel (val productName: String = "")
    

    还有一个 .XML 文件,其中包含一个 RecyclerView,它也看起来像这样:

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view"/>
    

    要显示所有产品名称,请按照以下步骤操作。

    现在您需要在您的活动中找到RecyclerView 并设置LinearLayoutManager,但首先您需要以下导入:

    import kotlinx.android.synthetic.main.activity_main.*
    

    然后只需使用以下代码行:

    recycler_view.layoutManager = LinearLayoutManager(this)
    

    其中recycler_view 实际上是RecyclerView 的ID,如上面的.XML 文件所示。

    然后您需要创建 Firestore 数据库的根引用和一个 Query 对象,如下所示:

    val rootRef = FirebaseFirestore.getInstance()
    val query = rootRef!!.collection("products").orderBy("productName", Query.Direction.ASCENDING)
    

    然后你必须像这样创建一个FirestoreRecyclerOptions 对象:

    val options = FirestoreRecyclerOptions.Builder<ProductModel>().setQuery(query, ProductModel::class.java).build()
    

    在您的活动类中,创建一个如下所示的holder 类:

    private inner class ProductViewHolder internal constructor(private val view: View) : RecyclerView.ViewHolder(view) {
        internal fun setProductName(productName: String) {
            val textView = view.findViewById<TextView>(R.id.text_view)
            textView.text = productName
        }
    }
    

    现在我们需要创建一个适配器类,在这种情况下应该如下所示:

    private inner class ProductFirestoreRecyclerAdapter internal constructor(options: FirestoreRecyclerOptions<ProductModel>) : FirestoreRecyclerAdapter<ProductModel, ProductViewHolder>(options) {
        override fun onBindViewHolder(productViewHolder: ProductViewHolder, position: Int, productModel: ProductModel) {
            productViewHolder.setProductName(productModel.productName)
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.item_product, parent, false)
            return ProductViewHolder(view)
        }
    }
    

    您的item_product .XML 文件应如下所示:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text_view""/>
    

    然后创建一个声明为全局的adapter 字段:

    private var adapter: ProductFirestoreRecyclerAdapter? = null
    

    并像这样在您的活动中实例化它:

    adapter = ProductFirestoreRecyclerAdapter(options)
    recycler_view.adapter = adapter
    

    最后别忘了重写以下两个函数并开始监听变化:

    override fun onStart() {
        super.onStart()
        adapter!!.startListening()
    }
    
    override fun onStop() {
        super.onStop()
    
        if (adapter != null) {
            adapter!!.stopListening()
        }
    }
    

    结果是这样的:

    正如您使用 Kotlin 所看到的,代码更加简单,代码行数更少,但请记住,官方文档永远不会为您提供特定代码,您必须自己创建。

    【讨论】:

    • 谢谢,但这是java中的信息,我在KOTLIN中搜索。你能帮我处理 KOTLIN 吗?
    • 您可以简单地复制 Java 代码并将其粘贴到您的 IDE 中,然后就会被 Kotlin 代码覆盖,对吧?
    • 我试图这样做但没有工作。请帮助我使用 KOTLIN。
    • 没有看到你的一些代码,如果你不提供你得到的行为或错误,我帮不上什么忙。但我会尽力为您提供该示例的快速改编。
    • @Dika 您可以简单地将产品的 id 作为属性存储在文档中,然后像这样使用它:productViewHolder.setProductId(productModel.productId)
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2018-10-17
    相关资源
    最近更新 更多