如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?

Posted

技术标签:

【中文标题】如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?【英文标题】:How to display data from Firestore in a RecyclerView with Android? 【发布时间】:2018-08-22 23:39:33 【问题描述】:

使用 androidRecyclerView 中显示现有 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 的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DragSortListView

Android RecyclerView嵌套RecyclerView

Android-Recyclerview-使用分割线

如何让 RecyclerView 更新其布局?

使用 SQLite 的搜索结果更新 RecyclerView

加载数据后 Recyclerview 项目高度更改