Как правильно получить доступ к именам документов в FireStore, чтобы заполнить RecyclerView? - PullRequest
1 голос
/ 04 июля 2019

После этого Я пытаюсь заполнить мои RecyclerView сообщениями из моего Firestore.

Мой Firestore структурирован точно так же, как в связанном ответе, поэтому я пытаюсь повторить его.Я думаю, что моя проблема в том, что я не получаю доступ к названию документов должным образом.Должен ли я использовать .get() для получения имени?Ниже приведено то, что у меня есть:

private CollectionReference userFollowingReference = rootRef.collection("following/"+ currentUser.getUid()+"/UserIsFollowing");
Query first = rootRef.collection("posts/"+ userFollowingReference.getId()+"/userPosts")
                .orderBy("date", Query.Direction.DESCENDING)
                .limit(3);
        first.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull final Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : task.getResult()) {
                        Post post = document.toObject(Post.class);
                        list.add(post);
                    }
                    followerAdapter.notifyDataSetChanged();

                    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);
                            lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                            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 = userFollowingReference.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()) {
                                                Post post = d.toObject(Post.class);
                                                list.add(post);
                                            }
                                            followerAdapter.notifyDataSetChanged();
                                            lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);

                                            if (t.getResult().size() < 3) {
                                                isLastItemReached = true;
                                            }
                                        }
                                    }
                                });
                            }
                        }
                    };
                    recyclerView.addOnScrollListener(onScrollListener);
                }
            }
        });

Должно быть добавлено сообщений от всех пользователей, за которыми следит текущий пользователь, но мой вывод пуст

Редактировать: Вот скриншот моей БД: enter image description here enter image description here Подколлекция UserIsFollowing содержит документы, названные в честь пользователей, за которыми следует пользователь, чье единственное полеa boolean Установите значение true.

Редактировать 2:

Я изменил код, чтобы сначала получить список подписчиков, а затем использовать этот список для получения своих сообщений, но этовсе еще не работает:

Query first = userFollowingReference;//TODO Realtime updates
        first.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull final Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : task.getResult()) {
                        String id = document.getId();
                        followingList.add(id);
                    }
                    followerAdapter.notifyDataSetChanged();
                    if(!followingList.isEmpty()) {
                        Query second = rootRef.collection("posts/" + followingList.get(0) + "/userPosts")
                                .orderBy("date", Query.Direction.ASCENDING)
                                .limit(3);
                        second.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                            @Override
                            public void onComplete(@NonNull final Task<QuerySnapshot> task) {
                                if(task.isSuccessful()) {
                                    List<Post> list = new ArrayList<>();
                                    for(DocumentSnapshot document : task.getResult()){
                                        Post post = document.toObject(Post.class);
                                        list.add(post);
                                    }
                                    recyclerView.setAdapter(followerAdapter);
                                    followerAdapter.notifyDataSetChanged();
                                    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(final RecyclerView recyclerView, int dx, int dy) {
                                            super.onScrolled(recyclerView, dx, dy);
                                            lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                                            int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
                                            int visibleItemCount = linearLayoutManager.getChildCount();
                                            int totalItemCount = linearLayoutManager.getItemCount();

                                            if (isScrolling && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached) {
                                                isScrolling = false;
                                                Query nextQuery = rootRef.collection("posts")
                                                        .orderBy("date", 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()) {
                                                                Post post = d.toObject(Post.class);
                                                                postList.add(post);
                                                            }
                                                            followerAdapter.notifyDataSetChanged();
                                                            lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);

                                                            if (t.getResult().size() < 3) {
                                                                isLastItemReached = true;
                                                            }
                                                        }
                                                    }
                                                });
                                            }
                                        }
                                    };

                                    recyclerView.addOnScrollListener(onScrollListener);
                                }

                            }
                        });
                    }
                }
            }
        });

Редактировать 3:

Я получаю эту ошибку:

E/RecyclerView: No adapter attached; skipping layout
    No adapter attached; skipping layout
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...