Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

502
Vistas
¿Cómo cambiar la visibilidad de un TextView si un MutableList está vacío? (Android/Kotlin)

Estoy trabajando en una aplicación de contador de calorías simple usando dos fragmentos y un ViewModel. Soy principiante y esta es una modificación de una aplicación que acabo de crear para un curso (esta aplicación no es una tarea). Utiliza ViewModel y tiene un fragmento que recopila la entrada del usuario y un fragmento que muestra la entrada como MutableList de MutableLiveData. Me gustaría que la pantalla de la lista estuviera inicialmente vacía excepto por un TextView con instrucciones, y me gustaría que las instrucciones desaparecieran una vez que se haya agregado una entrada a la lista. El instructor de mi clase me dijo que usara una declaración if-else en el fragmento con la lista para lograr esto, pero no funciona. No me dijo exactamente dónde ponerlo. Probé un montón de lugares diferentes, pero ninguno de ellos funcionó. No obtengo errores, simplemente no hay cambios en la visibilidad de TextView.

Aquí está el código para ViewModel con la lista:

 val entryList: MutableLiveData<MutableList<Entry>> get() = _entryList init { _entry = MutableLiveData<Entry>() _entryList.value = mutableListOf() } fun addEntry(entryInfo: Entry){ _entry.value = entryInfo _entryList.value?.add(_entry.value!!) } }

Y este es el código para el observador en el fragmento de la lista:

 Observer { entryList -> val entryListView: View = inflater.inflate(R.layout.fragment_entry_list, null, false) if (entryList.isNullOrEmpty()) { entryListView.instructions_text_view.visibility = View.VISIBLE } else { entryListView.instructions_text_view.visibility = View.GONE } entryList.forEach {entry -> val view: View = inflater.inflate(R.layout.entry_list_item, null, false) view.date_entry_text_view.text = String.format(getString(R.string.date), entry.date) view.calories_entry_text_view.text = view.line_divider binding.entryList.addView(view) }

Gracias por cualquier ayuda.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Supongo que espera que su observador reciba una notificación del evento cuando agrega entryInfo a su lista de eventos ( _entryList.value?.add(_entry.value!!) . Pero esto no sucederá ya que solo está agregando un elemento a la misma lista mutable, y como la referencia de la lista no ha cambiado, los datos en vivo no emitirán ninguna actualización.

Para solucionar esto, tienes dos opciones.

  • Cree nuevos datos booleanos en vivo que controlen cuándo mostrar y ocultar el texto de información. Establezca su valor inicial en false y actualícelo a true en la función addEntry() .
  • En lugar de actualizar la misma lista mutable, cree una copia de ella, agregue el elemento y establezca el entryList.value igual a esta nueva lista. De esta manera su observador será notificado de la nueva lista.

Además, generalmente no es una buena práctica exponer datos mutables a menos que no haya otra alternativa. Aquí está exponiendo una lista mutable de Entrada y eso también en forma de datos en vivo mutables. Idealmente, debería exponer LiveData<List<Entry>> .

Esta es una posible implementación de todos los puntos que mencioné:

 private val _entryList = MutableLiveData(listOf<Entry>()) // Create a private mutable live data holding an empty entry list, to avoid the initial null value. val entryList: LiveData<List<Entry>> = _entryList // Expose an immutable version of _entryList fun addEntry(entryInfo: Entry) { _entryList.value = entryList.value!! + entryInfo }

No he usado los datos en vivo de _entry aquí, pero puede implementarlos de la misma manera.

over 4 years ago · Santiago Trujillo Denunciar

0

configure su viewModel para observar en la entrada agregada.

Creo que ha cambiado su visibilidad en los bloques if else incorrectos.

 if (entryList.isNullOrEmpty()) { entryListView.instructions_text_view.visibility = View.GONE // OR View.INVISIBLE } else { entryListView.instructions_text_view.visibility = View.VISIBLE }
over 4 years ago · Santiago Trujillo Denunciar

0

Su observador debería recibir una notificación de los cambios en la lista de entradas cuando _entryList haya cambiado. Asegúrese de llamar a la función addEntry() para activar la notificación.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda