【问题标题】:Firestore pagination last visible document throws out of bound exceptionFirestore 分页最后一个可见文档抛出越界异常
【发布时间】:2020-06-30 03:44:31
【问题描述】:

已尝试通过使用这些链接https://stackoverflow.com/a/50742175/4232013 来使用 Firestore 分页,但在集合中添加了一些文档后我突然面临 ArrayIndexOutOfBoundsException 任何人都可以帮助我指出我在哪里犯了错误谢谢。 我的代码:

 private int limit = 2;
private int PostLimit = 1;

   private void GettingFollowingList() {
    followingList = new ArrayList<>();
    String UserID = FirebaseAuth.getInstance().getUid();
    followingList.add(UserID);

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("Users")
            .document(UserID)
            .collection("UserDetails")
            .document(UserID)
            .collection("Following")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                            Followers followers = documentSnapshot.toObject(Followers.class);
                            followingList.add(followers.getFollow_id());
                            Log.d(TAG, "onComplete: FolloIDS: " + followers.getFollow_id());
                        }

                        ReadingPosts();
   

                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                }
            });

}

我的寻呼:

     private void ReadingPosts() {


    String userId = FirebaseAuth.getInstance().getUid();
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    followingList.add(userId);
    final CollectionReference UserRef = db.collection("UserPosts");
    Query query = UserRef.limit(limit);

    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull final Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                    
                    for (String id : followingList) {
                       

                        if (documentSnapshot.getId().equals(id)) {
                            Log.d(TAG, "onComplete: IDS3 :" + id);
                            FirebaseFirestore db = FirebaseFirestore.getInstance();
                            CollectionReference PostRef = db.collection("UserPosts")
                                    .document(id)
                                    .collection("Posts");

                            Query query = PostRef.orderBy("timestamp", Query.Direction.DESCENDING).limit(PostLimit);

                            query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> task) {

                                    if (task.isSuccessful()) {
                                        for (QueryDocumentSnapshot documentSnapshot1 : task.getResult()) {
                                            Posts posts = documentSnapshot1.toObject(Posts.class);
                                            postsList.add(posts);
                                            
                                        }
                                    }

                                    postsAdapter.notifyDataSetChanged();
                                    swipeRefreshLayout.setRefreshing(false);
                                }
                            })

                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Log.d(TAG, "onFailure: Failed to get the posts");
                                        }
                                    });
                        }
                    }

                    postsAdapter.notifyDataSetChanged();
                }

                lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);

                RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {

                    @Override
                    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                        if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                            isScrolling = true;
                        }
                    }

                    @Override
                    public void onScrolled(@NonNull 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 = UserRef.startAfter(lastVisible).limit(2);
                            nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> task1) {
                                    if (task1.isSuccessful()) {
                                        for (QueryDocumentSnapshot documentSnapshot : task1.getResult()) {
                                           
                                            for (String id : followingList) {
                                                
                                                if (documentSnapshot.getId().equals(id)) {
                                                    Log.d(TAG, "onComplete: IDS3 :" + id);
                                                    FirebaseFirestore db = FirebaseFirestore.getInstance();
                                                    CollectionReference PostRef = db.collection("UserPosts")
                                                            .document(id)
                                                            .collection("Posts");

                                                    Query query = PostRef.orderBy("timestamp", Query.Direction.DESCENDING).limit(PostLimit);

                                                    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<QuerySnapshot> task) {

                                                            if (task.isSuccessful()) {
                                                                for (QueryDocumentSnapshot documentSnapshot1 : task.getResult()) {
                                                                    Posts posts = documentSnapshot1.toObject(Posts.class);
                                                                    postsList.add(posts);
                                                                }
                                                            }

                                                            postsAdapter.notifyDataSetChanged();
                                                        }
                                                    })

                                                            .addOnFailureListener(new OnFailureListener() {
                                                                @Override
                                                                public void onFailure(@NonNull Exception e) {
                                                                    Log.d(TAG, "onFailure: Failed to get the posts");
                                                                }
                                                            });
                                                }
                                            }


                                        }

                                        postsAdapter.notifyDataSetChanged();
                                        lastVisible = task1.getResult().getDocuments().get(task1.getResult().size() - 1);

                                        if (task1.getResult().size() < limit) {
                                            isLastItemReached = true;
                                        }
                                    }
                                }
                            });
                        }

                    }
                };
                post_recycler_view.addOnScrollListener(onScrollListener);


            } else {
                Log.d(TAG, "Error getting documents: ", task.getException());
            }
        }
    });

}

我正面临这一行的错误输出

  lastVisible = task1.getResult().getDocuments().get(task1.getResult().size() - 1);

我的日志输出

java.lang.ArrayIndexOutOfBoundsException: length=0;指数=-1 在 java.util.ArrayList.get(ArrayList.java:439)

【问题讨论】:

    标签: java android google-cloud-firestore android-paging


    【解决方案1】:

    错误消息告诉您,您获得的结果页面包含 0 个文档。如果task1.getResult().size() 返回 0,那么从中减去 1 将是 -1,并且您不能使用 -1 对数组进行索引。你应该在对它做任何事情之前检查它的大小。

    【讨论】:

    • 谢谢!当我在查询后检查日志是最后一个文档时,它的大小变为 0,所以我更改了我的“private int limit = 2;”到“3”然后没有错误最后一个文件显示在正确的位置,但我担心的是我这样做的正确方式!还是我将来搞砸了什么。但无论如何感谢您帮助我。
    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多