【问题标题】:Data binding collection to view with Android MVVM使用 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>

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

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

【问题讨论】:

    标签: java android kotlin mvvm data-binding


    【解决方案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_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>
    

    在 ViewModel 中:

    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

    附言不要忘记添加

    buildFeatures {
            dataBinding true
        }
    
    

    到你的 build.gradle 文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 2013-12-17
      • 1970-01-01
      • 2019-10-11
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多