Estoy tratando de usar FirestorePagingAdapter para mostrar una lista de todos los usuarios en mi base de datos de almacén de incendios. Estoy usando FirestorePagingAdapter en lugar de FirestoreRecyclerAdapter para minimizar el número de lecturas ya que F irestorePagingAdapter no lee la lista completa de documentos mientras que FirestoreRecyclerAdapter lo hace. Puedo mostrar la lista paginada con éxito, pero necesito implementar onClickListener en ella y al hacer clic en cada elemento, necesito abrir otra actividad que muestre una descripción detallada del usuario en particular en el que se hizo clic. Para esto, necesito pasar el documentId del usuario seleccionado a la siguiente actividad.

Pero desafortunadamente, FirestorePagingAdapter no tiene el método getSnapshots (), así que uso getSnapshots (). GetSnapshot (position) .getId ().

Por otro lado, FirestoreRecyclerAdapter tiene este método que hace que buscar la identificación del documento sea una tarea muy fácil. Algo así: ¿Cómo obtener la identificación o el nombre del documento en Android en Firestore db para pasar a otra actividad?

// 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);
                            }
                        });
                    }
                };
1
Shubhaw Kumar 9 may. 2019 a las 18:08

3 respuestas

La mejor respuesta

Pude hacer esto usando SnapshotParser en el método setQuery. A través de esto, pude modificar el objeto que obtuve del almacén de incendios. El método documentSnapshot.getId() devuelve la identificación del documento.

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();

En la clase Usuario, acabo de agregar otro campo "String userId" en la clase Usuario. El campo userId no existe en mi documento de almacén de incendios. En onClickListener, puedo usar directamente user.userId para obtener la identificación del documento y enviarlo a otra actividad.

1
Shubhaw Kumar 9 may. 2019 a las 17:23

Como ya has notado:

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

No funciona, solo funciona cuando se usa FirestoreRecyclerAdapter. Para resolver esto, debe almacenar la identificación del documento como propiedad de su documento. Si la identificación del documento es la identificación del usuario que proviene de la autenticación de Firebase, simplemente almacene ese uid. Si no está utilizando uid, obtenga la identificación del documento y páselo al constructor User cuando cree un nuevo objeto como este:

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);
0
Alex Mamo 9 may. 2019 a las 15:24

Intenta usar esto

getSnapshots().getSnapshot(position).getId()
-1
Simas Joneliunas 23 feb. 2020 a las 03:14