Enlace de datos de la colección a la vista con Android MVVM
He estado aprendiendo WPF con MVVM durante un tiempo y he oído que MVVM también funciona en Android. Solía escribir el siguiente código en C#.
C#:
public class TodoListViewModel
{
public List<todoitem> todoList;
}
public class TodoItem
{
public string TaskName { get; set; }
public string Description { get; set; }
public int Priority { get; set; }
}
WPF XAML:
<listbox width="400" margin="10" itemssource="{Binding Path=todoList}">
<listbox.itemtemplate>
<datatemplate>
<stackpanel>
<textblock text="{Binding Path=TaskName}"></textblock>
<textblock text="{Binding Path=Description}"></textblock>
<textblock text="{Binding Path=Priority}"></textblock>
</stackpanel>
</datatemplate>
</listbox.itemtemplate>
</listbox>
Y me preguntaba si hay una forma similar de escribirlo en Kotlin/Android, como en el siguiente código.
Kotlin:
class TodoListViewModel {
var todoList: ObservableArrayList<todoitem>
}
class TodoItem {
var TaskName: ObservableField<string>
var Description: ObservableField<string>
var Priority: ObservableField<int>
}
Android XML:
<linearlayout source="@={viewModel.todoList}">
<textview android:text="@={TaskName}"></textview>
<textview android:text="@={Description}"></textview>
<textview android:text="@={Priority}"></textview>
</linearlayout>
Lamento hacer una pregunta tan básica, pero no puedo encontrar ninguna solución similar, incluso en StackOverflow. Puedo encontrar muchas soluciones que utilizan Adapter
o Factory
, pero esos enfoques instancian objetos de vista con código, y creo que no son la mejor manera de trabajar con XML y MVVM.
Gracias de antemano por sus comentarios y respuestas. Está bien si prefiere utilizar Java en lugar de Kotlin.
davy.ai
Sí, hay una forma similar de escribir el código anterior en Kotlin/Android utilizando el patrón MVVM.
Kotlin:
Android XML:
Ten en cuenta que en Kotlin, utilizamos
MutableLiveData
paratodoList
en lugar deObservableArrayList
. Además, utilizamosdata class
paraTodoItem
e inicializamostodoList
en el bloqueinit
.En el XML de Android, utilizamos
ListView
en lugar deLinearLayout
y utilizamos el atributoentries
para enlazarviewModel.todoList
a la lista de vista.Espero que esto ayude. ¡Hazme saber si tienes alguna pregunta!