Data binding не обновляет textview MVVM Kotlin
Изучаю MVVM, пишу счетчик нажатий на кнопку. Есть класс, в котором есть только одно значение Int. Этот класс передается в viewmodel и из viewmodel берется значение в textview. При первом включении отображается корректно, значение устанавливаемое строкой val data = percent(0), нажатия обрабатываются (по логам переменная меняет значение), но значение в textview не обновляется. Я полагаю, проблема в live data или в отсутствии оповещения об изменении данных. Я пытался это сделать, но ни к чему это не привело. Что необходимо сделать?
xml:
<layout ...>
<data>
<import type="android.view.View"/>
<variable
name="vm"
type="com.example.recyclingstarter.viewmodel.MainViewModel" />
</data
<ConstraintLayout ...>
<TextView
android:layout_width="30dp"
android:layout_height="30dp"
android:text="@{String.valueOf(vm.data.value)}"/>
<Button
android:onClick="@{() -> vm.increase()}"
.../>
...
Percent.kt:
data class percent(var value: Int)
MainViewModel.kt:
public class MainViewModel(var data: precent) : ViewModel() {
fun increase(){
data.value++
Log.d("viewmodelcheck", data.value.toString())
}
MainActivity.kt
lateinit var binding : ActivityMainBinding
lateinit var ViewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val data = percent(0) // При изменении значения, изначальный текст будет показан
ViewModel = MainViewModel(data)
binding.lifecycleOwner = this
binding.vm = ViewModel
...
Gradle:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt'
}
...
dataBinding {
enabled true
}
...
kapt 'com.android.databinding:compiler:4.1.1'
Ответы (1 шт):
Автор решения: Виталий Сорокин
→ Ссылка
Решением оказалось необходимость в создании livedata во viewmodel:
public class MainViewModel(var data: precent) : ViewModel() {
val num: MutableLiveData<Int> by lazy {
MutableLiveData<Int>().apply { value = data.value } // задаем входное значение
}
fun increase(){
num.value = num.value!!.toInt() + 1
Log.d("viewmodelcheck", num.value.toString())
}
}