Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图相关的知识,希望对你有一定的参考价值。

我刚开始使用android Studio在Kotlin上编程,而我目前正在使用列表视图开发一些问题。

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

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

这是我在第一堂课中使用的代码,在该代码中可以正确显示列表:

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= "%.$1f".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)
            
    

很抱歉,我发布了这么长的第一篇文章,但我非常绝望。也请原谅我的英语生锈。

先谢谢您。

答案

活动所在的活动:

val适配器= AdaptadorListaEstablecimientos(this,establecimientosList)


无法使用的活动:

val适配器= ArrayAdapter(this,android.R.layout.simple_list_item_1,listItems)

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

以上是关于Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图

Kotlin,Android Studio:我无法让我的程序使用第二个适配器。列表视图

在 Kotlin/Android Studio 中无法将 mp3 转换为 pcm - UnsupportedAudioFileException

如何使用 kotlin 在 android studio 中引用 timerPicker

如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?

Android Studio无法运行项目