Skip to content

Instantly share code, notes, and snippets.

@Pooh3Mobi
Created February 26, 2020 14:30
Show Gist options
  • Save Pooh3Mobi/4009e05603a763c03410b5dc0e302479 to your computer and use it in GitHub Desktop.
Save Pooh3Mobi/4009e05603a763c03410b5dc0e302479 to your computer and use it in GitHub Desktop.
ViewModel + DataBinding sample
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewmodel"
type="com.example.mvvmlab.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewmodel.user.nickname}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
package com.example.mvvmlab
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableBoolean
import androidx.databinding.ObservableField
import androidx.databinding.ObservableInt
import androidx.lifecycle.*
import com.example.mvvmlab.databinding.ActivityMainBinding
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private val viewModel :MainViewModel by lazy {
ViewModelProvider.NewInstanceFactory().create(MainViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val binding: ActivityMainBinding =
DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.viewmodel = viewModel
binding.lifecycleOwner = this
viewModel.loadUser()
}
}
class MainViewModel() : ViewModel() {
private val liveDataUser = LiveDataUser()
private val observableUser = ObservableUser()
val user: LiveDataUser
get() = liveDataUser
// val user: ObservableUser
// get() = observableUser
fun loadUser() {
viewModelScope.launch {
delay(1000L)
liveDataUser.apply {
nickname.value = "タロー"
firstName.value = "太郎"
lastName.value = "山田"
age.value = 22
birthMonthOfYear.value = "11"
birthDayOfMonth.value = "12"
address.value = "東京都世田谷区"
isPremium.value = false
}
}
}
fun loadUser2() {
viewModelScope.launch {
delay(1000L)
observableUser.apply {
nickname.set("タロー")
firstName.set("太郎")
lastName.set("山田")
age.set(22)
birthMonthOfYear.set("11")
birthDayOfMonth.set("12")
address.set("東京都世田谷区")
isPremium.set(false)
}
}
}
}
class ObservableUser {
val nickname = ObservableField<String>()
val firstName = ObservableField<String>()
val lastName = ObservableField<String>()
val age = ObservableInt()
val birthMonthOfYear = ObservableField<String>()
val birthDayOfMonth = ObservableField<String>()
val address = ObservableField<String>()
val isPremium = ObservableBoolean()
}
class LiveDataUser {
val nickname = MutableLiveData<String>()
val firstName = MutableLiveData<String>()
val lastName = MutableLiveData<String>()
val age = MutableLiveData<Int>()
val birthMonthOfYear = MutableLiveData<String>()
val birthDayOfMonth = MutableLiveData<String>()
val address = MutableLiveData<String>()
val isPremium = MutableLiveData<Boolean>()
}
@ShinichiroFunatsu
Copy link

ShinichiroFunatsu commented Feb 26, 2020

なお、これでもいける

class MainViewModel() : ViewModel() {

    private val liveDataUser = MutableLiveData<User>()
    val user: LiveData<User>
        get() = liveDataUser

    fun loadUser() {
        viewModelScope.launch {
            delay(1000L)
            liveDataUser.value = User(
                nickname = "タロー",
                firstName = "太郎",
                lastName = "山田",
                age = 22,
                birthMonthOfYear = "11",
                birthDayOfMonth = "12",
                address = "東京都世田谷区",
                isPremium = false
            )
        }
    }
}

data class User (
    val nickname: String,
    val firstName: String,
    val lastName: String,
    val age: Int,
    val birthMonthOfYear: String,
    val birthDayOfMonth: String,
    val address: String,
    val isPremium: Boolean
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment