[introduzca la descripción de la imagen aquí] [1]

Aunque el código está formateado e implementado completamente bien, parece haber un error en la aplicación que no permite que la aplicación recupere y muestre los datos. Los componentes completos del back-end utilizados para construir el RecyclerView:

El fragmento que muestra RecyclerView:

package com.reazon.foodrunner.fragment

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.firebase.ui.database.FirebaseRecyclerAdapter
import com.google.firebase.database.*
import com.reazon.foodrunner.R
import com.reazon.foodrunner.adapter.HomeRecyclerAdapter
import com.reazon.foodrunner.model.Restaurants

class HomeFragment : Fragment() {

    private var mDatabaseReference: DatabaseReference? = null
    private var recyclerAdapter: HomeRecyclerAdapter? = null
    private var recyclerHome: RecyclerView? = null
    internal var restaurantsList: MutableList<Restaurants> = ArrayList()
    private var layoutManager: RecyclerView.LayoutManager? = null
    private lateinit var adapter: FirebaseRecyclerAdapter<Restaurants,HomeRecyclerAdapter.HomeRecyclerViewHolder>
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_home, container, false)
        mDatabaseReference = FirebaseDatabase.getInstance().getReference("Restaurants")
        recyclerHome = view.findViewById(R.id.recyclerHomeAll)

        layoutManager = LinearLayoutManager(activity)
        recyclerHome!!.layoutManager = layoutManager

        //retrieve data from firebase
        retrieveAllRestaurants()

        return view
    }

    private fun retrieveAllRestaurants() {
        restaurantsList.clear()
        val restaurantReference = FirebaseDatabase.getInstance().reference.child("Restaurants")

        restaurantReference.addValueEventListener(object : ValueEventListener {
            override fun onCancelled(error: DatabaseError) {
                Log.d("ERROR ", "" + error.message)
            }

            override fun onDataChange(p0: DataSnapshot) {
                for (snapshot in p0.children) {
                    val restaurant = snapshot.getValue(Restaurants::class.java)
                    restaurant!!.getRestaurant()
                    restaurant.getRestaurantRating()
                    restaurant.getCostForOne()
                    restaurant.getRestaurantName()

                    restaurantsList.add(restaurant)

                }
                recyclerAdapter = HomeRecyclerAdapter(context!! , restaurantsList)
                recyclerHome?.adapter = recyclerAdapter
            }
        })
    }
}

La clase de modelo utilizada: -
Clase de modelo

package com.reazon.foodrunner.model

class Restaurants {
    private var id: String? = null
    private var name: String? = null
    private var rating: String? = null
    private var cost_for_one: String? = null
    private var imageUrl: String? = null

    constructor()

    constructor(
        id: String,
        name: String,
        rating: String,
        cost_for_one: String,
        imageUrl: String
    ) {
        this.id = id
        this.name = name
        this.rating = rating
        this.cost_for_one = cost_for_one
        this.imageUrl = imageUrl
    }

    fun getRestaurant(): String? {
        return imageUrl
    }

    fun setRestaurant(imageUrl: String){
        this.imageUrl = imageUrl
    }

    fun getRestaurantId(): String? {
        return id
    }

    fun setRestaurantId(id: String){
        this.id = id
    }

    fun getRestaurantName(): String? {
        return name
    }

    fun setRestaurantName(name: String){
        this.name = name
    }
    fun getRestaurantRating(): String? {
        return rating
    }
    fun setRestaurantRating(rating: String){
        this.rating = rating
    }

    fun getCostForOne(): String? {
        return cost_for_one
    }
    fun setCostForOne(cost_for_one: String) {
        this.cost_for_one = cost_for_one
    }
}

La clase de adaptador utilizada: -
Clase de adaptador

package com.reazon.foodrunner.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.reazon.foodrunner.R
import com.reazon.foodrunner.model.Restaurants
import com.squareup.picasso.Picasso

class HomeRecyclerAdapter(
    var context: Context,
    var restaurantsList: List<Restaurants>
) : RecyclerView.Adapter<HomeRecyclerAdapter.HomeRecyclerViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeRecyclerViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_home_single_row, parent, false)
        return HomeRecyclerViewHolder(view)
    }

    override fun getItemCount(): Int {
        return restaurantsList.size
    }

    override fun onBindViewHolder(holder: HomeRecyclerViewHolder, position: Int) {
        val restaurant = restaurantsList[position]
        holder.costForOne.text = restaurant.getCostForOne().toString()
        holder.rating.text = restaurant.getRestaurantRating().toString()
        holder.textView.text = restaurant.getRestaurantName()
            Picasso.get().load(restaurant.getRestaurant()).placeholder(R.drawable.food_runner_icon).into(holder.imageView).toString() 
        holder.btnFavourite.setOnClickListener {
            Toast.makeText(context ,"Favourite Button Clicked",Toast.LENGTH_LONG).show()
        }
    }

    class HomeRecyclerViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var imageView: ImageView = view.findViewById(R.id.imgRestaurantImage)
        var costForOne: TextView = view.findViewById(R.id.txtCostForOne)
        var textView: TextView = view.findViewById(R.id.txtRestaurantName)
        var btnFavourite: ImageButton = view.findViewById(R.id.btnFavourite)
        var rating: TextView = view.findViewById(R.id.txtRating)
    }
}

Estructura de la base de datos de Firebase: [1]: https://i.stack.imgur.com/XDrxa.png

1
Ayush 4 ago. 2020 a las 05:28

1 respuesta

La mejor respuesta

Aunque el código está formateado e implementado completamente bien, parece haber un error en la aplicación que no permite que la aplicación recupere y muestre los datos.

El principal problema en su código radica en su clase Restaurants, donde el nombre de todos sus captadores es incorrecto. Si tiene en su clase una propiedad llamada id, el captador correspondiente debería ser getId() y no getRestaurantId(). Por otro lado, el colocador debe ser setId() y no setRestaurantId(). Hay dos formas de resolver este problema. El primero sería cambiar todos los nombres de todos los getters / setters de acuerdo con el ejemplo anterior.

También tenga en cuenta que los setters y getters no son obligatorios. Los definidores siempre son opcionales porque si no hay un definidor para una propiedad JSON, el cliente de Firebase establecerá el valor directamente en el campo. Sin embargo, una forma más sencilla de crear dicha clase es definir e inicializar las propiedades directamente en el constructor y establecer la clase como data class:

data class Restaurant(
    var id: String? = null,
    var name: String? = null,
    var rating: String? = null,
    var cost_for_one: String? = null,
    var imageUrl: String? = null
)

Tenga en cuenta también que el nombre de la clase es Restaurant y no Restaurants, y esto se debe a que esta clase puede considerarse un modelo para un solo restaurante y no para más restaurantes. .

1
Alex Mamo 4 ago. 2020 a las 07:50