[英]Data binding collection to view with Android MVVM
我用 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 中是否有類似的編寫方式,如下所示。
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 android:text="@={Description}" />
<TextView android:text="@={Priority}" />
</LinearLayout>
我很抱歉提出這樣一個基本問題,但我找不到任何類似的解決方案,即使在 StackOverflow 上也是如此。 我可以使用Adapter
或Factory
找到許多解決方案,但這些方法是使用代碼實例化視圖對象,我認為這些方法並不是使用 XML 和 MVVM 的最佳方法。
提前感謝您的評論和回答。 如果您對 Java 比 Kotlin 更熟悉,那么 Java 就可以了。
在您的情況下,最好的方法是將視圖模型傳輸到您的布局,然后使用其中的字段。 我會告訴你方法:
在您的片段中:
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_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/yourText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{viewModel.text}" />
</LinearLayout>
</layout>
在視圖模型中:
class YourViewModel() : ViewModel() {
val text = ObservableField<String>()
fun setText(newText: String) {
text.set(newText)
}
}
概括:
ps別忘了加
buildFeatures {
dataBinding true
}
到您的 build.gradle 文件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.