我从你的问题中了解到,你已经成功地在你的 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 所看到的,代码更加简单,代码行数更少,但请记住,官方文档永远不会为您提供特定代码,您必须自己创建。