使用 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>
对于提出这样一个基本问题,我深表歉意,但我找不到任何类似的解决方案,即使在 *** 上也是如此。我可以使用Adapter
或Factory
找到许多解决方案,但这些方法是用代码实例化视图对象,我认为这些不是使用 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进阶笔记14:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)