Как получить идентификатор документа в In FirestorePagingAdapter? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь использовать FirestorePagingAdapter для отображения списка всех пользователей в моей базе данных firestore.Я использую FirestorePagingAdapter вместо FirestoreRecyclerAdapter, чтобы минимизировать количество операций чтения, так как F irestorePagingAdapter не читает весь список документов, в то время как FirestoreRecyclerAdapter делает.Я могу успешно отобразить разбитый на страницы список, но мне нужно внедрить onClickListener в него, и по щелчку каждого элемента мне нужно открыть другое действие, которое показывает подробное описание конкретного пользователя, на которого был выполнен щелчок.Для этого мне нужно передать documentId выбранного пользователя следующему действию.

Но, к сожалению, FirestorePagingAdapter не имеет метода getSnapshots (), поэтому я использую getSnapshots (). GetSnapshot (position) .getId ().

С другой стороны, FirestoreRecyclerAdapter имеет этот метод, который делает выборку идентификатора документа очень простой задачей.Примерно так: Как получить идентификатор документа или имя в Android в Firestore db для перехода к другому виду деятельности?

// Query to fetch documents from user collection ordered by name
Query query = FirebaseFirestore.getInstance().collection("users")
                .orderBy("name");

// Setting the pagination configuration
PagedList.Config config = new PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPrefetchDistance(10)
                .setPageSize(20)
                .build();


FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
                .setLifecycleOwner(this)
                .setQuery(query, config, User.class)
                .build();

firestorePagingAdapter =
                new FirestorePagingAdapter<User, UserViewHolder>(firestorePagingOptions){

                    @NonNull
                    @Override
                    public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                        View view = LayoutInflater.from(parent.getContext())
                                .inflate(R.layout.single_user_layout, parent, false);

                        return new UserViewHolder(view);
                    }

                    @Override
                    protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull User user) {
                        holder.setUserName(user.name);
                        holder.setStatus(user.status);
                        holder.setThumbImage(user.thumb_image, UsersActivity.this);


                        holder.mView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Intent userProfileIntent = new Intent(UsersActivity.this, UserProfileActivity.class);
                                // Need to fetch the user_id to pass it as intent extra
                                // String user_id = getSnapshots().getSnapshot(position).getId();
                                // userProfileIntent.putExtra("user_id", user_id);
                                startActivity(userProfileIntent);
                            }
                        });
                    }
                };

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Мне удалось сделать это, используя метод SnapshotParser в setQuery. Благодаря этому мне удалось изменить объект, который я получил от пожарного магазина. Метод documentSnapshot.getId() возвращает идентификатор документа.

FirestorePagingOptions<User> firestorePagingOptions = new FirestorePagingOptions.Builder<User>()
                .setLifecycleOwner(this)
                .setQuery(query, config, new SnapshotParser<User>() {
                    @NonNull
                    @Override
                    public User parseSnapshot(@NonNull DocumentSnapshot snapshot) {
                        User user = snapshot.toObject(User.class);
                        user.userId = snapshot.getId();
                        return user;
                    }
                })
                .build();

В классе User я просто добавил еще одно поле "String userId" в классе User. Поле userId не существует в моем документе пожарного депо. В onClickListener я могу затем напрямую использовать user.userId, чтобы получить идентификатор документа и отправить его в другой вид деятельности.

0 голосов
/ 09 мая 2019

Как вы уже заметили:

String id = getSnapshots().getSnapshot(position).getId();

Не работает, работает только при использовании FirestoreRecyclerAdapter. Поэтому, чтобы решить эту проблему, вам нужно сохранить идентификатор документа как свойство вашего документа. Если идентификатор документа является идентификатором пользователя, который приходит из аутентификации Firebase, просто сохраните это uid. Если вы не используете uid, получите идентификатор документа и передайте его конструктору User при создании нового объекта, подобного этому:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
String id = eventsRef.document().getId();
User user = new User(id, name, status, thumb_image);
usersRef.document(id).set(user);
...