java android firebase android-recyclerview google-cloud-firestore

java - ¿Cómo mostrar datos de Firestore en un RecyclerView con Android?



firebase android-recyclerview (1)

Suponiendo que tiene una estructura de base de datos de Firestore que se ve así:

Firestore-root | --- products (collection) | --- documentIdOne (document) | | | --- productName: "Milk" | --- documentIdTwo (document) | | | --- productName: "Soy Milk" | --- documentIdThree (document) | --- productName: "Bacon"

Una clase de modelo que también se ve así:

public class ProductModel { private String productName; public ProductModel() {} public ProductModel(String productName) {this.productName = productName;} public String getProductName() {return productName;} }

Y un archivo .XML que contiene un RecyclerView que también se ve así:

<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler_view"/>

Para mostrar todos los nombres de productos, siga los siguientes pasos.

Primero, necesita encontrar el RecyclerView en su actividad y configurar el LinearLayoutManager esta manera:

RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this));

Luego, debe crear la referencia raíz de su base de datos de Firestore y un objeto Query como este:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); Query query = rootRef.collection("products") .orderBy("productName", Query.Direction.ASCENDING);

Luego tendrá que crear un objeto FirestoreRecyclerOptions como este:

FirestoreRecyclerOptions<ProductModel> options = new FirestoreRecyclerOptions.Builder<ProductModel>() .setQuery(query, ProductModel.class) .build();

En su clase de actividad, cree una clase de holder que se vea así:

private class ProductViewHolder extends RecyclerView.ViewHolder { private View view; ProductViewHolder(View itemView) { super(itemView); view = itemView; } void setProductName(String productName) { TextView textView = view.findViewById(R.id.text_view); textView.setText(productName); } }

Luego cree un adapter que se declare como global:

private FirestoreRecyclerAdapter<ProductModel, ProductViewHolder> adapter;

Y ejemplifícalo en tu actividad así:

adapter = new FirestoreRecyclerAdapter<ProductModel, ProductViewHolder>(options) { @Override protected void onBindViewHolder(@NonNull holder productViewHolder, int position, @NonNull ProductModel productModel) { holder.setProductName(productModel.getProductName()); } @NonNull @Override public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_product, parent, false); return new ProductViewHolder(view); } }; recyclerView.setAdapter(adapter);

Al final, no olvide anular los siguientes dos métodos y comenzar a escuchar los cambios:

@Override protected void onStart() { super.onStart(); adapter.startListening(); } @Override protected void onStop() { super.onStop(); if (adapter != null) { adapter.stopListening(); } }

El resultado es este:

Editar:

Si desea mostrar un mensaje brindis cuando el usuario hace clic en un elemento, agregue las siguientes líneas de código dentro del método setProductName() de la clase ProductViewHolder :

textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(), productName, Toast.LENGTH_SHORT).show(); } });

¿Cuál es la mejor manera de mostrar datos de una base de datos de Firestore existente en un RecyclerView con Android?

Esto no se cubre como una explicación completa en una respuesta, por lo que he agregado este estilo de preguntas y respuestas para que pueda vincularse en los comentarios.