
如果使用docs代码:
// Construct query for first 25 citIEs,ordered by populationquery first = db.collection("citIEs") .orderBy("population") .limit(25);first.get() .addOnSuccessListener(new OnSuccessListener<querySnapshot>() { @OverrIDe public voID onSuccess(querySnapshot documentSnapshots) { // ... // Get the last visible document documentSnapshot lastVisible = documentSnapshots.getdocuments() .get(documentSnapshots.size() -1); // Construct a new query starting at this document,// get the next 25 citIEs. query next = db.collection("citIEs") .orderBy("population") .startAfter(lastVisible) .limit(25); // Use the query for pagination // ... }}); 怎么做?文档没有太多细节.
PS:用户滚动时我需要使用回收站视图(不是列表视图).谢谢
解决方法 正如 official documentation中提到的,解决这个问题的关键是使用 startAfter()方法.因此,您可以通过将查询游标与limit()方法相结合来对查询进行分页.您将能够将批处理中的最后一个文档用作下一批的游标的开头.要解决这个分页问题,请参阅我在post中的回答,其中我已逐步解释了如何从较小的块中加载Cloud Firestore数据库中的数据,并在按钮单击时将其显示在ListVIEw中.
解:
要从Firestore数据库获取数据并在RecyclerVIEw中以较小的块显示,请按照以下步骤 *** 作.
我们来看上面使用过产品的例子.您可以使用产品,城市或任何您想要的东西.原则是一样的.假设您想在用户滚动时加载更多产品,我将使用RecyclerVIEw.OnScrollListener.
让我们首先定义RecyclerVIEw并设置布局管理器:
RecyclerVIEw recyclerVIEw = findVIEwByID(R.ID.recycler_vIEw);recyclerVIEw.setLayoutManager(new linearlayoutmanager(this));
假设我们有一个如下所示的数据库结构:
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;}} 这个适配器类应该是这样的:
private class ProductAdapter extends RecyclerVIEw.Adapter<ProductVIEwHolder> { private List<ProductModel> List; ProductAdapter(List<ProductModel> List) { this.List = List; } @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); } @OverrIDe public voID onBindVIEwHolder(@NonNull ProductVIEwHolder productVIEwHolder,int position) { String productname = List.get(position).getProductname(); productVIEwHolder.setProductname(productname); } @OverrIDe public int getItemCount() { return List.size(); }} item_product布局仅包含一个视图,即TextVIEw.
<TextVIEw androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:ID="@+ID/text_vIEw" androID:textSize="25sp"/>
这就是持有者类应该是这样的:
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); }} 现在,让我们将限制定义为全局变量并将其设置为15.
private int limit = 15;
现在让我们使用这个限制来定义查询:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();CollectionReference productsRef = rootRef.collection("products");query firstquery = productsRef.orderBy("productname",query.Direction.ASCENDING).limit(limit); 以下是在您的案例中也具有魔力的代码:
query.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); } ProductAdapter productAdapter = new ProductAdapter(List); recyclerVIEw.setAdapter(productAdapter); lastVisible = task.getResult().getdocuments().get(task.getResult().size() - 1); RecyclerVIEw.OnScrollListener onScrollListener = new RecyclerVIEw.OnScrollListener() { @OverrIDe public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,int newState) { super.onScrollStateChanged(recyclerVIEw,newState); if (newState == AbsListVIEw.OnScrollListener.SCRolL_STATE_touch_SCRolL) { isScrolling = true; } } @OverrIDe public voID onScrolled(RecyclerVIEw recyclerVIEw,int dx,int dy) { super.onScrolled(recyclerVIEw,dx,dy); linearlayoutmanager linearlayoutmanager = ((linearlayoutmanager) recyclerVIEw.getLayoutManager()); int firstVisibleItemposition = linearlayoutmanager.findFirstVisibleItemposition(); int visibleItemCount = linearlayoutmanager.getChildCount(); int totalitemCount = linearlayoutmanager.getItemCount(); if (isScrolling && (firstVisibleItemposition + visibleItemCount == totalitemCount) && !isLastItemReached) { isScrolling = false; query nextquery = productsRef.orderBy("productname",query.Direction.ASCENDING).startAfter(lastVisible).limit(limit); 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); } productAdapter.notifyDataSetChanged(); lastVisible = t.getResult().getdocuments().get(t.getResult().size() - 1); if (t.getResult().size() < limit) { isLastItemReached = true; } } } }); } } }; recyclerVIEw.addOnScrollListener(onScrollListener); } }}); 其中lastVisible是documentSnapshot对象,它表示查询中的最后一个visibile项.在这种情况下,每15个一个,它被声明为gloabl变量:
private documentSnapshot lastVisible;
isScrolling和isLastItemReached也是全局变量,声明为:
private boolean isScrolling = false;private boolean isLastItemReached = false;总结
以上是内存溢出为你收集整理的如何使用Android对Firestore进行分页?全部内容,希望文章能够帮你解决如何使用Android对Firestore进行分页?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)