ViewModel и LiveData в Data Binding

Это перевод третьей части из цикла об интеграции ViewModel c Koltin Coroutines, Data Binding и Navigation.

Чтобы более тесно на практике познакомиться с этими компонентами, записывайтесь на продвинутый курс по разработке приложения “Чат-мессенжер”

ViewModel и LiveData в Data Binding

Добавлено в Android Studio 3.1
Для Java и Kotlin


Весь этот шаблон LiveData

Эта интеграция стара, но хороша. ViewModel обычно содержат LiveData, и LiveData предназначена для наблюдения. Обычно это означает добавление наблюдателя во фрагмент:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    
    myViewModel.name.observe(this, { newName ->
        // Update the UI. In this case, a TextView.
        nameTextView.text = newName
    })
  
}

Библиотека Data Binding предназначена для наблюдения за вашими данными и обновления пользовательского интерфейса. Используя ViewModel, LiveData и Data Binding вместе, вы можете удалить предыдущий код наблюдения LiveData и ссылаться на ваши ViewModel и LiveData прямо из XML-макета.

Использование Data Binding, ViewModel и LiveData

Допустим, в вашем XML-макете вы хотите сослаться на вашу ViewModel:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="viewmodel" 
                  type="com.android.MyViewModel"/>
    </data>
    <... Rest of your layout ...>
</layout>

Чтобы использовать LiveData с Data Binding, вам просто нужно вызвать binding.setLifecycleOwner (this), а затем передать вашу ViewModel привязке, например так:

class MainActivity : AppCompatActivity() {
    
    // This ktx requires at least androidx.activity:activity-ktx:1.0.0
    private val myViewModel: MyViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
      
         //Inflate view and create binding
        val binding: MainActivityBinding = 
            DataBindingUtil.setContentView(this, R.layout.main_activity)

        //Specify this activity as the lifecycleOwner for Data Binding
        binding.lifecycleOwner = this
        
        // Pass the ViewModel into the binding
        binding.viewmodel = myViewModel
    }

}

Теперь в вашем макете вы можете использовать вашу ViewModel. Как видно ниже, я установил текст в viewmodel.name:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable name="viewmodel" 
                  type="com.android.MyViewModel"/>
    </data>
    <TextView
            android:id="@+id/name"
            android:text="@{viewmodel.name}"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"/>
</layout>

Обратите внимание, что viewmodel.name может быть строкой или LiveData. Если это LiveData, пользовательский интерфейс будет обновляться при каждом изменении LiveData.

Вопросы о какой-либо из этих функций? Оставьте комментарий! Спасибо за прочтение!

Продолжение следует

Додати коментар