我有一个如下所示的查询:
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
组合查询游标来对查询进行分页?这甚至可能吗?
答案 0 :(得分:5)
正如@FrankvanPuffelen已经在之前的question中回答过,您无法实现这一点,因为在您的情况下,您应该将2个不同的查询(first
和second
)传递给单个适配器,FirestoreRecyclerAdapter
无法实现。您可以使用第一个查询,也可以使用适配器的单个实例。
解决方案是创建两个不同的列表,其中包含每个查询的结果并将它们组合在一起。然后,您可以将结果列表传递给另一个适配器,让我们说ArrayAdapter
,然后将结果显示为ListView
,或者更好地显示RecyclerView
。在这种情况下的问题是,您将无法使用FirestoreRecyclerAdapter
类提供的实时功能,但这种方法将解决您的问题。
修改强>
根据您在评论部分提出的请求,我将为您举例说明如何使用ListView
和ArrayAdapter
以最简单的方式对按钮点击进行分页。向下滚动时,您也可以使用RecyclerView
来实现相同的功能。但为了简单起见,我们假设我们有ListView
和Button
,我们希望在每次点击按钮时将更多项目加载到列表中。为此,我们首先定义视图:
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;
Edit2:Here 您还可以获得有关如何从Firestore数据库获取数据的解决方案,并在用户滚动时在RecyclerView
中以较小的块显示。
答案 1 :(得分:1)
一种可能的方法是将每个项目的推键保存在单独的节点中。
然后从该节点获取所有键到数组列表或其他东西..
然后根据您的分页编号从此数组List中获取密钥并使用orderByKey Query和startAt和LimitToFirst查询组合以制作分页算法