FirebaseUI - заполнение RecyclerView для данных динамического запроса - PullRequest
0 голосов
/ 05 мая 2018

У меня есть Collection в базе огня, в которой есть определенное количество предметов, назовем это Collection "СЛЕДУЮЩИЙ". Это количество предметов будет постоянно меняться. В любой момент времени я хочу прослушать количество элементов в этом Collection и создать несколько whereEqualto() вызовов для объекта Query, основанного на другой «Коллекции», назовем его «POLLS»:

        Query followingQuery = mStoreBaseRef.collection(USERS_LABEL).document(id).collection(FOLLOWING_LABEL);
        x = followingQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
            //This number is constantly changing, and I want to use it to query the "Polls" node
            int numberOfUsersFollowed = documentSnapshots.size();
            if (documentSnapshots.isEmpty() || documentSnapshots == null) {
                mRecyclerview.setVisibility(View.INVISIBLE);
                return;
            } else {
                Log.v("NUBER_OF_USER_FOLLOWED", String.valueOf(numberOfUsersFollowed));
                mFollowingUserQuery = mStoreBaseRef.collection(POLLS_LABEL);
                //Based on the number of users being "Followed," I want to search for those users' respective polls in the "Polls" node, and populate the RecyclerView based on this information
                for (DocumentSnapshot x : documentSnapshots) {
                    Following followedUser = x.toObject(Following.class);
                    String userID = followedUser.getUser_id();
                    Log.v("FOLLOWED_USER_ID", userID);
                    mFollowingUserQuery = mFollowingUserQuery.whereEqualTo(USER_ID_LABEL, userID);
                }

                FirestoreRecyclerOptions<Poll> storeOptions = new FirestoreRecyclerOptions.Builder<Poll>()
                        .setQuery(mFollowingUserQuery, Poll.class)
                        .build();

                mFirestoreAdaper = new FirestoreRecyclerAdapter<Poll, PollHolder>(storeOptions) {
                    @Override
                    protected void onBindViewHolder(@NonNull final PollHolder holder, final int position, @NonNull Poll model) {
                        holder.mPollQuestion.setText(model.getQuestion());
                        String voteCount = String.valueOf(model.getVote_count());
                        //TODO: Investigate formatting of vote count for thousands
                        holder.mVoteCount.setText(voteCount);
                        Picasso.with(getActivity().getApplicationContext())
                                .load(model.getImage_URL())
                                .fit()
                                .into(holder.mPollImage);
                        holder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Intent toClickedPoll = new Intent(getActivity(), PollHostActivity.class);
                                String recyclerPosition = getSnapshots().getSnapshot(position).getId();
                                Log.v("Firestore ID", recyclerPosition);
                                toClickedPoll.putExtra("POLL_ID", recyclerPosition);
                                startActivity(toClickedPoll);

                            }
                        });
                    }

                    @Override
                    public PollHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                        View v = LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.latest_item, parent, false);
                        return new PollHolder(v);
                    }
                };

                mRecyclerview.setAdapter(mFirestoreAdaper);
                scrollToPosition();
                mFirestoreAdaper.startListening();

            }
        }
    });

По существу, число whereEqualTo() будет динамическим.

РЕДАКТИРОВАТЬ: My FirebaseUI RecylcerView не заполняет никаких данных на основе запроса выше. У меня есть все эти методы в моем .onStart(), поэтому я ожидал бы, что на основе изменений в узле «Follow» он будет динамически заполняться, однако он пуст.

1 Ответ

0 голосов
/ 05 мая 2018

Похоже, что вы ожидаете, что несколько операторов where будут действовать как логическое ИЛИ, с ожиданием, что вы получите документы, которые соответствуют любому условиям, которые вы указываете с помощью whereEqualTo. Это не так, как работают запросы Firestore. Когда у вас есть несколько условий, они действуют как логическое И, означающее, что все условий должны быть истинными, чтобы документ соответствовал запросу.

Если вам нужно логическое ИЛИ, вам придется выполнить несколько запросов для каждого из условий, а затем объединить результаты. Это означает, что вы не сможете использовать FirestoreRecyclerAdapter, так как для этого требуется один запрос.

...