gpt4 book ai didi

java - 有没有办法通过使用 FirestoreRecyclerAdapter 组合查询游标来对查询进行分页?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:27 25 4
gpt4 key购买 nike

我有一个如下所示的查询:

Query first = ref.orderBy("name", Query.Direction.ASCENDING).limit(10);

这就是我将数据显示到我的 RecyclerView 的方式。

firestoreRecyclerOptions = new FirestoreRecyclerOptions.Builder<ModelClass>().setQuery(query, ModelClass.class).build();
myFirestoreRecyclerAdapter = new MyFirestoreRecyclerAdapter(firestoreRecyclerOptions);
recyclerView.setAdapter(myFirestoreRecyclerAdapter);

我正在尝试使用 here 中指定的分页我无法解决它。

first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
DocumentSnapshot lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
Query second = ref.orderBy("name", Query.Direction.ASCENDING).startAfter(lastVisible).limit(10);
//Create a firestoreRecyclerOptions and setting the adapter
}
});

有没有办法通过使用 FirestoreRecyclerAdapter 组合查询游标来对查询进行分页?这可能吗?

最佳答案

@FrankvanPuffelen 已经在之前的 question 中回答过你的,你无法实现这一点,因为在你的情况下,你应该将 2 个不同的查询(firstsecond)传递给单个适配器,这对于 是不可能的FirestoreRecyclerAdapter。您可以将第一个查询或第二个查询用于适配器的单个实例。

一个解决方案是创建两个不同的列表,包含每个查询的结果并将它们合并。然后您可以将结果列表传递给另一个适配器,比方说一个 ArrayAdapter,然后将结果显示到一个 ListView 中,或者在 RecyclerView 中显示得更好.这种情况下的问题是您将无法使用 FirestoreRecyclerAdapter 类提供的实时功能,但这种方法可以解决您的问题。

编辑:

根据您在评论部分的要求,我将为您提供一个示例,说明如何使用 ListViewArrayAdapter< 以最简单的方式对按钮单击时的查询进行分页。向下滚动时,您也可以使用 RecyclerView 实现同样的效果。但为简单起见,假设我们有一个 ListView 和一个 Button,并且我们希望在每次单击按钮时将更多项目加载到列表中。为此,让我们首先定义 View :

ListView listView = findViewById(R.id.list_view);
Button button = findViewById(R.id.button);

假设我们有一个如下所示的数据库结构:

Firestore-root
|
--- products (collection)
|
--- productId (document)
|
--- productName: "Product Name"

还有一个看起来像这样的模型类:

public class ProductModel {
private String productName;

public ProductModel() {}

public ProductModel(String productName) {this.productName = productName;}

public String getProductName() {return productName;}

@Override
public String toString() { return productName; }
}

现在,让我们定义一个限制设置为 3 的查询。

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");
Query firstQuery = productsRef.orderBy("productName", Query.Direction.ASCENDING).limit(3);

这意味着每次点击按钮,我们都会加载 3 个以上的项目。现在,这是神奇的代码:

firstQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<ProductModel> list = new ArrayList<>();
for (DocumentSnapshot document : task.getResult()) {
ProductModel productModel = document.toObject(ProductModel.class);
list.add(productModel);
}
ArrayAdapter<ProductModel> arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
listView.setAdapter(arrayAdapter);
lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Query nextQuery = productsRef.orderBy("productName", Query.Direction.ASCENDING).startAfter(lastVisible).limit(3);
nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> t) {
if (t.isSuccessful()) {
for (DocumentSnapshot d : t.getResult()) {
ProductModel productModel = d.toObject(ProductModel.class);
list.add(productModel);
}
arrayAdapter.notifyDataSetChanged();
lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);
}
}
});
}
});
}
}
});

其中 lastVisible 是一个 DocumentSnapshot 对象,表示查询中的最后一个可见项目。在这种情况下,每隔三分之一,它被声明为 gloabl 变量:

private DocumentSnapshot lastVisible;

编辑2: Here您还有关于如何从 Firestore 数据库获取数据并在用户滚动时将其以较小的 block 显示在 RecyclerView 中的解决方案。

关于java - 有没有办法通过使用 FirestoreRecyclerAdapter 组合查询游标来对查询进行分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50592325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com