如何使用Android对Firestore进行分页?

如何使用Android对Firestore进行分页?,第1张

概述我阅读了Firestore文档和互联网上的所有文章(stackoverflow)关于Firestore分页但没有运气.我试图在docs中实现确切的代码,但没有任何反应.我有一个基本的数据库项目(超过1250或更多),我想逐步得到它们.通过滚动来加载15个项目(到数据库中的最后一项). 如果使用docs代码: // Construct query for first 25 cities, order 我阅读了Firestore文档和互联网上的所有文章(stackoverflow)关于Firestore分页但没有运气.我试图在docs中实现确切的代码,但没有任何反应.我有一个基本的数据库项目(超过1250或更多),我想逐步得到它们.通过滚动来加载15个项目(到数据库中的最后一项).

如果使用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进行分页?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1134394.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存