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.
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.
false y actualícelo a true en la función addEntry() . 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.
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 }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.