Динамически раздувать вид в MVVM - PullRequest
0 голосов
/ 17 мая 2018

Я довольно новичок в DataBinding и не могу понять, как динамически раздувать представление в MVVM

Подробнее В частности, необходимо накачать макет с помощью 2 TextViews onClick кнопки Add и удалить этот View onClick of Delete Button.

Без MVVM все выглядит достаточно просто, но с MVVM кто-то может мне помочь, как добиться того же.

1 Ответ

0 голосов
/ 17 мая 2018

В этом примере в качестве основного языка используется Kotlin.

Включение привязки данных в вашем Gradle (модуль приложения)

apply plugin: 'kotlin-kapt'

android {
    ...
    dataBinding {
        enabled = true
    }
    ...
}

dependencies {
    ...
    // LiveData + ViewModel
    implementation "android.arch.lifecycle:extensions:1.1.1"
    ...
}

Теперь создайте три файла, например:

  • TestViewModel // Он будет содержать модели, которые будут питать информацию для представления (test_fragment_layout)
  • TestFragment // Он будет содержать экземпляр TestViewModel и FragmentTestBinding (автоматически сгенерированный класс)
  • layout_test_fragment.xml// Макет FragmentTest

Теперь добавьте две строки в TestViewModel ...

class TestViewModel: ViewModel() {
    private var textA: String? = null
    private var textB: String? = null

    fun setUp(textA: String, textB: String) {
        this.textA = textA
        this.textB = textB
    }

    //Kotlin needs explicit getters, used by autogenerated class
    fun getTextA() = textA 
    fun getTextB() = textB
}

Теперь создайте TestFragment и его layout_test_fragment.xml

Макет будет выглядетькак это:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable
            name="viewModel"
            type="com.test.viewmodel.TestViewModel" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".TestFragment">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{viewModel.textA}" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{viewModel.textB}" />
    </LinearLayout>
</layout>

Имея макет, скомпилируйте ваш проект, и AndroidStudio создаст класс с именем FragmentTestBinding (location: app> build> generate> source> apt> debug> com.yourpackage> FragmentTestBinding)

Наконец, в TestFragment добавьте следующие строки

class TestFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val binding = FragmentTestBinding.inflate(inflater, container, false)
        val viewModel = ViewModelProviders.of(this).get(TestViewModel::class.java)
        viewModel.setUp("Hello World", "from DataBinding")
        binding.viewModel = viewModel
        return binding.root
    }
}

И вуаля, это результат .

Я загрузил пример в github , привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...