es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recupere objetos anidados de Firestore para la vista de reciclaje.

¿Cómo podemos recuperar los objetos anidados de Firestore y mostrarlos en un RecyclerView? Desde la base de datos, quiero obtener los objetos anidados de los productos en el RecyclerView para que se muestren allí todos los productos con sus detalles. Adjunto el código de la clase modelo y del adaptador.

CLASE MODELO

public class ProductModelClass {

    String Category, Details,Measure,Name;
    Number DiscountPrice, NumberofProducts, Price;

    public ProductModelClass() {}

    public ProductModelClass(String category, String details, String measure, String name, Number discountPrice, Number numberofProducts, Number price) {
        Category = category;
        Details = details;
        Measure = measure;
        Name = name;
        DiscountPrice = discountPrice;
        NumberofProducts = numberofProducts;
        Price = price;
    }

    public String getCategory() {
        return Category;
    }

    public void setCategory(String category) {
        Category = category;
    }

    public String getDetails() {
        return Details;
    }

    public void setDetails(String details) {
        Details = details;
    }

    public String getMeasure() {
        return Measure;
    }

    public void setMeasure(String measure) {
        Measure = measure;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public Number getDiscountPrice() {
        return DiscountPrice;
    }

    public void setDiscountPrice(Number discountPrice) {
        DiscountPrice = discountPrice;
    }

    public Number getNumberofProducts() {
        return NumberofProducts;
    }

    public void setNumberofProducts(Number numberofProducts) {
        NumberofProducts = numberofProducts;
    }

    public Number getPrice() {
        return Price;
    }

    public void setPrice(Number price) {
        Price = price;
    }

}

ADAPTADOR

public class ProductListAdapter extends RecyclerView.Adapter<productlistadapter.viewholder> {

    private OnItemClickListener listener = null;

    ArrayList<productmodelclass> data;

    public ProductListAdapter(ArrayList<productmodelclass> data, OnItemClickListener listener) {
        this.data = data;
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewTyp) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.products_item, null);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        holder.productTitle.setText(data.get(position).getName());
        holder.productQty.setText(String.valueOf(data.get(position).getNumberofProducts()));
        holder.productPrice.setText(String.valueOf(data.get(position).getPrice()));
        holder.productOffer.setText(String.valueOf(data.get(position).getDiscountPrice()));
        // Enlazando onClickListener
        holder.bind(data.get(position),listener);
    }


    public interface OnItemClickListener {
        void onItemClick(ProductModelClass item);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView productTitle, productQty, productPrice, productOffer;
        MaterialButton availability;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            productTitle = itemView.findViewById(R.id.product_title);
            productQty = itemView.findViewById(R.id.product_sub);
            productPrice = itemView.findViewById(R.id.product_price);
            productOffer = itemView.findViewById(R.id.product_offer_price);
            availability = itemView.findViewById(R.id.availability_prod);
        }

        public void bind(ProductModelClass productmodelclass, OnItemClickListener listener) {
            itemView.setOnClickListener(view -> listener.onItemClick(productmodelclass));
        }

    }
}

Esta es la estructura de mi base de datos. Quiero recuperar todos los diferentes productos bajo “tablets” y “mobiles” en mi RecyclerView. (Enlace de imagen: https://i.stack.imgur.com/Bgq2e.png)</productlistadapter.viewholder>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para recuperar los objetos anidados de Firestore y mostrarlos en una vista de reciclaje, puedes seguir estos pasos:

    1. Crea una instancia de Firestore en tu actividad o fragmento.
    2. Consulta la base de datos de Firestore en busca de los productos en las categorías “Tablets” y “Mobiles” utilizando el método “whereEqualTo” en el campo “category”.
    3. Recupera la instantánea de consulta usando el método “get” e itera a través de los documentos para obtener los datos del producto individual.
    4. Crea un ArrayList de objetos ProductModelClass y agrega cada dato de producto a la lista usando el método “toObject”.
    5. Pasa este ArrayList al adaptador.
    6. Vincula los datos en el método onBindViewHolder del adaptador para mostrarlo en la vista de reciclaje.

    Aquí hay un ejemplo de fragmento de código para recuperar datos de Firestore y pasarlos al adaptador:

    // Crea una instancia de Firestore
    FirebaseFirestore firestoreDB = FirebaseFirestore.getInstance();
    
    // Consulta la base de datos de Firestore en busca de los productos en las categorías "Tablets" y "Mobiles"
    firestoreDB.collection("products")
        .whereEqualTo("category", "Tablets")
        .get()
        .addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                // Recupera la instantánea de consulta
                QuerySnapshot querySnapshot = task.getResult();
    
                // Itera a través de los documentos para obtener los datos del producto individual
                ArrayList<productmodelclass> productList = new ArrayList<>();
                for (DocumentSnapshot document : querySnapshot.getDocuments()) {
                    // Agrega cada dato de producto a la lista
                    productList.add(document.toObject(ProductModelClass.class));
                }
    
                // Pasa el ArrayList al adaptador
                productListAdapter = new ProductListAdapter(productList, item -> {
                    // Gestiona el clic del elemento aquí
                });
    
                // Vincula los datos en el método onBindViewHolder del adaptador
                recyclerView.setAdapter(productListAdapter);
            } else {
                Log.d(TAG, "Error obteniendo productos: ", task.getException());
            }
        });
    

    Nota: Asegúrate de agregar las dependencias necesarias de Firebase y configurar la instancia de Firestore antes de usarla. Además, reemplaza “Tablets” por “Mobiles” para obtener los datos de la categoría de móviles.

Comments are closed.