繁体   English   中英

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

[英]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 上也是如此。 我可以使用AdapterFactory找到许多解决方案,但这些方法是使用代码实例化视图对象,我认为这些方法并不是使用 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)
    }
}

概括:

  1. 使用 ViewModel 管理布局中所有可能的值。
  2. 来自 VM 的字段既可以是常见字段,也可以是可观察字段。
  3. 使用 bindingAdapters 将发现许多附加功能。 阅读有关此https://developer.android.com/topic/libraries/data-binding/binding-adapters的更多信息

ps别忘了加

buildFeatures {
        dataBinding true
    }

到您的 build.gradle 文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM