Я относительно новичок в программировании на 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.
Заранее спасибо.