android - Kotlin,Android Studio:我无法让我的程序使用第二个适配器。 ListView

标签 android kotlin google-cloud-firestore android-listview android-arrayadapter

对于使用Android Studio在Kotlin上进行编程,我是一个相对较新的人,并且我目前正在开发有关列表 View 的问题。

我目前正在关注this tutorial,并进行了一些更改以使它可以在我的程序中使用,即使它的重点是从JSON文件中获取数据,而我又从Firestore中获取数据。

我从Firestore数据库中读取了数据。首先,我阅读了它,以列出我所在地区的餐馆(文件) list ,我对此没有任何问题。但是,一旦我尝试根据这些餐厅(文档)的数据创建另一个列表,例如菜单上的产品类别(饮料,沙拉,汉堡等),我将无法在屏幕上显示任何内容,即使我在这个新类上使用完全相同的方法和适配器。

这是我在第一个类中使用的代码,在其中我得到了正确显示的列表:

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)
            }
    }
}

对于这么长的第一篇文章,我感到很抱歉,但是我非常绝望。也请谅解我的英语使用rust 。

先感谢您。

最佳答案

工作所在的 Activity :

val适配器= AdaptadorListaEstablecimientos(this,establecimientosList)

不起作用的 Activity :

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

如果ArrayAdapter和AdaptadorListaEstablecimientos基本上是同一适配器,则它不需要额外的属性(在本例中为android.R.layout.simple_list_item_1)。您应该进一步研究适配器之间的差异。

关于android - Kotlin,Android Studio:我无法让我的程序使用第二个适配器。 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61237175/

相关文章:

Android - 数据库被锁定

android - 为什么将 hardwareaccelerated 设置为 false 会使事情变得更快?

java - Glide 使用 URL 从 firebase 加载图像速度非常慢

android - 如何防止在我的 flutter 应用程序的特定部分截屏?

firebase - 无法在Flutter应用程序中获得Silver Effect

android - 为什么我的启动器图标放在 Android 桌面上时会变小?

android - 是否可以在不按电源按钮的情况下启动手机?

kotlin - 如何从不同的函数发出 Flow 值? Kotlin 协程

java - 结构化 Firestore Android 可获取多个位置检查

dart - 在显示之前对从 StreamBuilder 获取的数据执行异步操作