使用 Android MVVM 查看数据绑定集合

Posted

技术标签:

【中文标题】使用 Android MVVM 查看数据绑定集合【英文标题】:Data binding collection to view with Android MVVM 【发布时间】:2022-01-18 11:00:26 【问题描述】:

我用 MVVM 学习 WPF 已经有一段时间了,听说 MVVM 也可以在 android 上运行。我以前用 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 Text="Binding Path=Description"/>
         <TextBlock Text="Binding Path=Priority"/>
       </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate>
 </ListBox>

想知道在 Kotlin/Android 中是否有类似的编写方式,如下所示。

科特林:

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 android:text="@=Description" />
    <TextView android:text="@=Priority" />
</LinearLayout>

对于提出这样一个基本问题,我深表歉意,但我找不到任何类似的解决方案,即使在 *** 上也是如此。我可以使用AdapterFactory 找到许多解决方案,但这些方法是用代码实例化视图对象,我认为这些不是使用 XML 和 MVVM 的最佳方法。

提前感谢您的 cmets 和答案。如果你对 Java 比对 Kotlin 更熟悉,那么 Java 没问题。

【问题讨论】:

【参考方案1】:

在您的情况下,最好的方法是将视图模型传输到您的布局,然后使用其中的字段。我给你指路:

在您的片段中:

private val viewModel = YourViewModel()
private lateinit var binding: YourLayoutBinding

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View 
        binding = DataBindingUtil.inflate(inflater, R.layout.your_layout, container, false)
        return binding.root
    

override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)

        binding.viewModel = viewModel
    

在布局中:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

        <variable
            name="viewModel"
            type="pathToYourVM" />
    </data>

    <LinearLayout
        android:id="@+id/root"
        android:layout_
        android:layout_
        android:orientation="vertical">

<com.google.android.material.textview.MaterialTextView
            android:id="@+id/yourText"
            android:layout_
            android:layout_
            android:text="@viewModel.text" />
    </LinearLayout>
</layout>

在 ViewModel 中:

class YourViewModel() : ViewModel() 
    val text = ObservableField<String>()

    fun setText(newText: String) 
        text.set(newText)
    

总结:

    使用 ViewModel 管理布局中所有可能的值。 VM 中的字段既可以是普通字段,也可以是可观察字段。 使用 bindingAdapters 会发现许多附加功能。阅读更多关于此https://developer.android.com/topic/libraries/data-binding/binding-adapters

附言不要忘记添加

buildFeatures 
        dataBinding true
    

到你的 build.gradle 文件

【讨论】:

以上是关于使用 Android MVVM 查看数据绑定集合的主要内容,如果未能解决你的问题,请参考以下文章

在 MVVM 中将 Observable 集合绑定到 wrappanel

我应该如何在 Android 的 viewModel 中获取 Resources(R.string)(MVVM 和数据绑定)

我可以在不使用gradle的情况下使用Xamarin.Android中的Android数据绑定库吗?不是MVVM for dotnet

如何构建Android MVVM应用程序

Android进阶笔记14:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

Android MVVM Demo实战解析