簡體   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