es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma similar de escribir el código anterior en Kotlin/Android utilizando el patrón MVVM.

    Kotlin:

    class TodoListViewModel {
        var todoList: MutableLiveData<><todoitem>> = MutableLiveData()
    
        init {
            // Inicializar todoList con datos por defecto
            todoList.value = listOf(
                TodoItem("Tarea 1", "Descripción 1", 1),
                TodoItem("Tarea 2", "Descripción 2", 2),
                TodoItem("Tarea 3", "Descripción 3", 3)
            )
        }
    }
    
    data class TodoItem(
        val taskName: String,
        val description: String,
        val priority: Int
    )
    

    Android XML:

    <linearlayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
    
        <listview android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@{viewModel.todoList}" android:divider="@android:color/black" android:dividerheight="1dp" android:choicemode="none"></listview>
    
    </linearlayout>
    

    Ten en cuenta que en Kotlin, utilizamos MutableLiveData para todoList en lugar de ObservableArrayList. Además, utilizamos data class para TodoItem e inicializamos todoList en el bloque init.

    En el XML de Android, utilizamos ListView en lugar de LinearLayout y utilizamos el atributo entries para enlazar viewModel.todoList a la lista de vista.

    Espero que esto ayude. ¡Hazme saber si tienes alguna pregunta!

Comments are closed.