如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?
Posted
技术标签:
【中文标题】如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?【英文标题】:How to display data from Firestore in a RecyclerView with Android? 【发布时间】:2018-08-22 23:39:33 【问题描述】:使用 android 在RecyclerView
中显示现有 Firestore 数据库中的数据的最佳方式是什么?
答案中没有完整解释,所以我添加了这种问答样式,以便可以在 cmets 中链接到。
【问题讨论】:
在其他网站上没有一个像样的例子吗? @AndréKool 我没有找到关于如何使用 Android 显示数据的完整示例。 【参考方案1】:假设您的 Firestore 数据库结构如下所示:
Firestore-root
|
--- products (collection)
|
--- documentIdOne (document)
| |
| --- productName: "Milk"
|
--- documentIdTwo (document)
| |
| --- productName: "Soy Milk"
|
--- documentIdThree (document)
|
--- productName: "Bacon"
一个看起来也像这样的模型类:
public class ProductModel
private String productName;
public ProductModel()
public ProductModel(String productName) this.productName = productName;
public String getProductName() return productName;
还有一个.XML
文件,其中包含一个RecyclerView
,它也看起来像这样:
<android.support.v7.widget.RecyclerView
android:layout_
android:layout_
android:id="@+id/recycler_view"/>
要显示所有产品名称,请按照以下步骤操作。
首先,您需要在您的活动中找到RecyclerView
,然后像这样设置LinearLayoutManager
:
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
然后您需要创建 Firestore 数据库的根引用和一个 Query
对象,如下所示:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("products")
.orderBy("productName", Query.Direction.ASCENDING);
然后你必须像这样创建一个FirestoreRecyclerOptions
对象:
FirestoreRecyclerOptions<ProductModel> options = new FirestoreRecyclerOptions.Builder<ProductModel>()
.setQuery(query, ProductModel.class)
.build();
在您的活动类中,创建一个如下所示的holder
类:
private class ProductViewHolder extends RecyclerView.ViewHolder
private View view;
ProductViewHolder(View itemView)
super(itemView);
view = itemView;
void setProductName(String productName)
TextView textView = view.findViewById(R.id.text_view);
textView.setText(productName);
然后创建一个声明为全局的adapter
:
private FirestoreRecyclerAdapter<ProductModel, ProductViewHolder> adapter;
并像这样在您的活动中实例化它:
adapter = new FirestoreRecyclerAdapter<ProductModel, ProductViewHolder>(options)
@Override
protected void onBindViewHolder(@NonNull holder productViewHolder, int position, @NonNull ProductModel productModel)
holder.setProductName(productModel.getProductName());
@NonNull
@Override
public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_product, parent, false);
return new ProductViewHolder(view);
;
recyclerView.setAdapter(adapter);
最后别忘了重写以下两个方法,开始监听变化:
@Override
protected void onStart()
super.onStart();
adapter.startListening();
@Override
protected void onStop()
super.onStop();
if (adapter != null)
adapter.stopListening();
结果是这样的:
编辑:
如果您想在用户单击某个项目时显示 toast 消息,请在 ProductViewHolder
类的 setProductName()
方法中添加以下代码行:
textView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Toast.makeText(getApplicationContext(), productName, Toast.LENGTH_SHORT).show();
);
【讨论】:
我正在做一个嵌套查询,首先用 Orders 填充列表,并为android onBindViewHolder
中的每个订单填充 OrderProducts,它正在工作,但存在性能问题并且很紧张。你会建议什么是正确的做法?谢谢
@fuadj 没有看到你的代码,我帮不上什么忙。因此,请使用 MCVE 发布另一个新问题,以便我或其他 Firebase 开发人员可以帮助您。
最后一件事是添加``` @Override protected void onStart() super.onStart(); this.adapter.startListening(); @Override 受保护的无效 onStop() super.onStop();适配器.stopListening(); ```以上是关于如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?的主要内容,如果未能解决你的问题,请参考以下文章
Android RecyclerView嵌套RecyclerView