如何使用Android在RecyclerView中显示Firestore中的数据?
使用Android在RecyclerView
显示现有Firestore数据库中数据的最佳方法是什么?
这不作为答案中的完整解释,因此我添加了此Q&A样式,以便可以在评论中链接。
假设您有一个如下所示的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;} }
一个包含RecyclerView
的.XML
文件,它看起来像这样:
要显示所有产品名称,请按照以下步骤操作。
首先,您需要在活动中找到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 options = new FirestoreRecyclerOptions.Builder () .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); } }
然后创建一个声明为global的adapter
:
private FirestoreRecyclerAdapter adapter;
并在您的活动中实例化它,如下所示:
adapter = new FirestoreRecyclerAdapter(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(); } });
- 单击属于RecyclerView内的CardView的ImageButton
- EditText失去了对RecyclerView中Scroll的关注
- RecyclerView没有连接适配器; 跳过布局,数据不显示
- java.lang.IllegalArgumentException:可能无法回收废弃或附加的视图。 isScrap:false isAttached:true
- 在RecyclerView.Adapter中单击传递数据
- Android:当软输入键盘出现时,Recyclerview不会resize
- 如何知道RecyclerView是否有足够的内容滚动?
- 在android中使用asynctask为RecyclerView下载图像
- 使用RecyclerView添加到GridLayout的动态按钮会相互添加