Kotlin, Android Studio: я не могу заставить мою программу использовать второй адаптер. Список просмотров - PullRequest
1 голос
/ 15 апреля 2020

Я относительно новичок в программировании на Kotlin с Android Studio, и в настоящее время у меня возникают некоторые проблемы с моими представлениями списка.

В настоящее время я следую этому учебнику , и после внесения некоторых изменений удалось заставить его работать для моей программы, даже если он сфокусирован на получении данных из файла JSON, а я получаю его из Firestore.

У меня есть мой данные считываются из базы данных Firestore. Сначала я прочитал его, чтобы составить список ресторанов (документов) из моего района, с которыми у меня нет проблем. Но как только я пытаюсь создать другой список на основе данных из этих ресторанов (документов), таких как категории продуктов в их меню (напитки, салаты, гамбургеры и т. Д. c.), Я не могу ничего показать на экране, хотя я использую точно такие же методы и адаптеры для этого нового класса.

Это код, который я использую из первого класса, в котором я правильно отображаю список:

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity
import com.al.tfmteleco.utiles.AdaptadorListaEstablecimientos
import com.google.firebase.firestore.FirebaseFirestore


val db = FirebaseFirestore.getInstance()


class Explorar : AppCompatActivity() {

    lateinit var listView: ListView
    private val establecimientosList = ArrayList<ModelEstablecimientos>()
    private var establecimiento: ModelEstablecimientos? = null
    private var IDEstablecimiento: Int? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_explorar)

        listView = findViewById<ListView>(R.id.listaEstablecimientos)
// 1
        getEstablecimientos()

        listView.setOnItemClickListener{_,_,position,_ ->
            finish()
            establecimiento = establecimientosList[position]
            IDEstablecimiento = establecimiento!!.ID

            println("La ID es: $IDEstablecimiento")
            val intent = Intent(this@Explorar, Establecimiento::class.java)
            intent.putExtra("establecimientoID", IDEstablecimiento.toString())
            startActivity(intent)

        }
    }

    private fun getEstablecimientos() {

        db.collection("establecimientos")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    establecimientosList.add(
                        ModelEstablecimientos(
                            document.getString("Nombre"),
                            document.getString("Categoria1"),
                            document.getString("Categoria2"),
                            document.getString("Categoria3"),
                            document.getString("Precio"),
                            document.getString("Localizacion"),
                            document.getLong("MesasDisponibles")?.toInt(),
                            document.getLong("MesasOcupadas")?.toInt(),
                            document.getLong("Abierto")?.toInt(),
                            document.getLong("PuntosOpiniones")?.toFloat(),
                            document.getLong("OpinionesTotales")?.toInt(),
                            document.id.toInt()
                        )
                    )

                    Log.d("Documentos", "${document.id} => ${document.data}")

// 2
                    val listItems = arrayOfNulls<String>(establecimientosList.size)
// 3
                    for (i in 0 until establecimientosList.size) {
                        val establecimiento = establecimientosList[i]
                        listItems[i] = establecimiento.nombre
                    }
// 4
                    val adapter =
                        AdaptadorListaEstablecimientos(
                            this,
                            establecimientosList
                        )
                    listView.adapter = adapter
                }
            }
            .addOnFailureListener { exception ->
                Log.d("Documentos", "Error getting documents: ", exception)
            }

    }
}

Это из класса адаптеров, используемого для этого списка.

import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import com.al.tfmteleco.ModelEstablecimientos
import com.al.tfmteleco.R


class AdaptadorListaEstablecimientos(private val context: Context,
    private val dataSource: ArrayList<ModelEstablecimientos>) : BaseAdapter() {

    private val inflater: LayoutInflater
            = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    //1
    override fun getCount(): Int {
        return dataSource.size
    }

    //2
    override fun getItem(position: Int): Any {
        return dataSource[position]
    }

    //3
    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    //4
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        // Get view for row item
        val rowView = inflater.inflate(R.layout.lista_establecimientos, parent, false)
        // Get title element
        val nombreTextView = rowView.findViewById(R.id.nombreEstablecimiento) as TextView

        // Get cat1 element
        val cat1TextView = rowView.findViewById(R.id.cat1Establecimiento) as TextView

        // Get cat1 element
        val cat2TextView = rowView.findViewById(R.id.cat2Establecimiento) as TextView

        // Get cat1 element
        val cat3TextView = rowView.findViewById(R.id.cat3Establecimiento) as TextView

        // Get rangoprecio element
        //val rangoprecioTextView = rowView.findViewById(R.id.precioEstablecimiento) as TextView

        // Get mapa element
        val mapaButton = rowView.findViewById(R.id.mapaEstablecimiento) as ImageView

        // Get mesas element
        val mesasTextView = rowView.findViewById(R.id.mesasEstablecimiento) as TextView

        // Get mensaje element
        val mensajeTextView = rowView.findViewById(R.id.mensajeEstablecimiento) as TextView

        // Get info element
        val infoButton = rowView.findViewById(R.id.infoEstablecimiento) as ImageView

        // Get points element
        val ptsTextView = rowView.findViewById(R.id.ptsOpinion) as TextView
        val ratingBarView = rowView.findViewById(R.id.ratingBar) as RatingBar

// 1
        val listaEstablecimientos = getItem(position) as ModelEstablecimientos

// 2
        nombreTextView.text = listaEstablecimientos.nombre                  // NOMBRE DEL ESTABLECIMIENTO
        cat1TextView.text = listaEstablecimientos.cat1                      // CATEGORIA 1 DEL ESTABLECIMIENTO
        cat2TextView.text = listaEstablecimientos.cat2                      // CATEGORIA 2 DEL ESTABLECIMIENTO
        cat3TextView.text = listaEstablecimientos.cat3                      // CATEGORIA 3 DEL ESTABLECIMIENTO


// LOCALIZACIÓN DEL ESTABLECIMIENTO
        if(listaEstablecimientos.loc == null){
            mapaButton.visibility = View.INVISIBLE
        }
            else{
            mapaButton.visibility = View.VISIBLE
        }

// MESAS DISPONIBLES DEL ESTABLECIMIENTO
        mesasTextView.text = listaEstablecimientos.mesasOcupadas.toString() +
                "/" +
                listaEstablecimientos.mesasDisponibles.toString() + " mesas ocupadas"
        var mesasO : Float = listaEstablecimientos.mesasOcupadas!!.toFloat()
        var mesasD : Float = listaEstablecimientos.mesasDisponibles!!.toFloat()
        if (mesasO/mesasD <= 0.2){
            mesasTextView.setTextColor(Color.parseColor("#2D6E30"))
        }
            else if (mesasO/mesasD <= 0.6){
            mesasTextView.setTextColor(Color.parseColor("#D14F00"))
        }
            else if (mesasO/mesasD >= 0.85){
            mesasTextView.setTextColor(Color.parseColor("#8A0000"))
        }

// ESTADO DEL ESTABLECIMIENTO
        if(listaEstablecimientos.mensaje == 0){
            mensajeTextView.text = "Cerrado"
            mensajeTextView.setTextColor(Color.parseColor("#8A0000"))
        }
            else if(listaEstablecimientos.mensaje == 1){
            mensajeTextView.text = "Abierto"
            mensajeTextView.setTextColor(Color.parseColor("#2D6E30"))
        }

// PUNTUACIÓN DEL LOCAL POR PARTE DE LOS USUARIOS
        var puntos : Float = listaEstablecimientos.puntos!!.toFloat()
        var opiniones : Float = listaEstablecimientos.opiniones!!.toFloat()

        // Formato para mostrar el número con un solo decimal
        var pts= "%.${1}f".format(puntos/opiniones).toFloat()

        ptsTextView.text = pts.toString()
        ratingBarView.rating = pts


// Si la posición del establecimiento en la lista es par, el fondo es algo más oscuro
        if(position % 2 == 0){
            rowView.setBackgroundColor(Color.parseColor("#E8E8E8"))
        }

        return rowView
    }
}

«Так хорошо, если это работает, просто попытайтесь адаптировать его», - подумал я. И я попытался, это должно быть еще проще, так как мне просто нужно было использовать стандартный шаблон списка с одним элементом (именем категории) в списке. По какой-то причине это не работает. Он отлично читает данные, но, кажется, не может адаптировать другой список.

Это код, который я использую и в котором я нахожу проблемы:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.ListView

class Categorias : AppCompatActivity() {

    private lateinit var listViewCategorias: ListView
    private val categoriasList = ArrayList<ModelCategorias>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_categorias)
        listViewCategorias = findViewById(R.id.listaCategorias)

        val establecimientoID=intent.getStringExtra("establecimientoID")
        println(establecimientoID)
        getCategorias(establecimientoID.toInt())

        setContentView(R.layout.activity_categorias)
    }

    private fun getCategorias(ID:Int) {

        db.collection("establecimientos").document(ID.toString()).collection("categorias")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    categoriasList.add(
                        ModelCategorias(
                            document.getString("Nombre_Categoria"),
                            document.id.toInt()
                        )
                    )

                    Log.d("Categorias", "${document.id} => ${document.data}")

// 2
                    val listItems = arrayOfNulls<String>(categoriasList.size)
// 3
                    for (i in 0 until categoriasList.size) {
                        val categoria = categoriasList[i]
                        listItems[i] = categoria.nombreCategoria.toString()
                        println(listItems[i].toString())
                    }

                    val adapter = ArrayAdapter(this,android.R.layout.simple_list_item_1, listItems)

                    listViewCategorias.adapter = adapter
                }
            }
            .addOnFailureListener { exception ->
                Log.d("Documentos", "Error getting documents: ", exception)
            }
    }
}

Я очень сожалею об этом очень длинном первом посте, но я довольно отчаялся. Простите за мой ржавый Engli sh.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 апреля 2020

Активность там, где он работает:

val адаптер = AdaptadorListaEstablecimientos (this, establecimientosList)


Активность там, где он не работает:

val адаптер = ArrayAdapter (this , android .R.layout.simple_list_item_1, listItems)

Если ArrayAdapter и AdaptadorListaEstablecimientos в основном являются одним и тем же адаптером, ему не требуется дополнительное свойство (в данном случае, android .R.layout. simple_list_item_1). Вам следует еще раз взглянуть на различия между адаптерами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...