使用KOTLIN将数据从Firebase Firestore显示到RecyclerView

时间:2018-08-08 12:19:50

标签: android firebase kotlin google-cloud-firestore

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

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

1 个答案:

答案 0 :(得分:2)

据您所知,您已经成功在logcat中显示了项目,对吗?因此,在这种情况下,您还需要执行两个步骤才能在RecyclerView中显示数据。

第一步是创建一个自定义适配器,或者如果您想使用FirestoreRecyclerAdapter,第二步是为您的商品创建一个holder类。最后,只需将适配器设置为RecyclerView就可以了。

已添加解决方案:

对于Java delopers, this 是推荐的方法,您可以从Cloud Firestore数据库检索数据并使用RecyclerViewFirestoreRecyclerAdapter中显示数据

对于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

并在您的活动中实例化它,如下所示:

productFirestoreRecyclerAdapter = ProductFirestoreRecyclerAdapter(options)
recycler_view.adapter = adapter

最后,不要忘记重写以下两个功能并开始侦听更改:

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

override fun onStop() {
    super.onStop()

    if (adapter != null) {
        adapter!!.stopListening()
    }
}

结果是这样的:

enter image description here

如您所见,使用Kotlin时,代码甚至更简单,代码行也更少,但是请记住,官方文档永远不会为您提供特定的代码,因此您必须创建自己的代码。