¿Cómo mostrar datos de Firestre en un RecyclerView con Android?

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

Esto no está cubierto como una explicación completa en una respuesta, así que agregué este estilo de preguntas y respuestas para que pueda vincularse en los comentarios.

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

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

Una clase 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í:

  

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

En primer lugar, debe encontrar el RecyclerView en su actividad y configurar el LinearLayoutManager la LinearLayoutManager 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 Firestre y un objeto Query como este:

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

Luego tendrá que crear un objeto FirestreRecyclerOptions como este:

 FirestreRecyclerOptions options = new FirestreRecyclerOptions.Builder() .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); } } 

A continuación, cree un adapter que se declara como global:

 private FirestreRecyclerAdapter adapter; 

Y ejemplifíquelo en su actividad de esta manera:

 adapter = new FirestreRecyclerAdapter(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 dos métodos siguientes y comience 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 esto:

enter image description here

Editar:

Si desea mostrar un mensaje de 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(); } });