2023. 2. 16. 15:33ㆍAndroid Jetpack/AAC
Viewmodel 역할을 덜어줄 Repositroy 추상화클래스 구현해보겟습니다.
안드로이드 에서의 Repository는 ViewModel이 요청하는 데이터를 로컬DB(Room) 또는 서버(Retrofit)로부터 가져와 전달해준다. 이를 통해 ViewModel은 누구한테 가져온 데이터인지에 대해 신경쓸 필요가 없어진다.
정리하면 , View -> Viewmodel -> Repositroy -> DB,서버
- 뷰모델로부터 예를들어 서버,DB 로 부터 데이터를 가져왓다하고 두 사이를 전달해 줄 Repository를 추가할 것이다. 이를 위해 Interface로 된 Repository와 이를 구체화 할 RepositoryImpl을 만든다.
package com.example.databinding.viewmodel
import androidx.lifecycle.LiveData
interface Repository {
fun getCounter() : LiveData<Int>
fun increaseCounter(number:Int)
}
package com.example.databinding.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
class RepositoyImpl(counter: Int) : Repository {
private val liveCounter = MutableLiveData(counter)
override fun getCounter(): LiveData<Int> {
return liveCounter
}
override fun increaseCounter(number: Int) {
liveCounter.value = liveCounter.value?.plus(number)
}
}
getCounter(): databinding을 통해 livecounter의 값이 변경되면 ui에 값을 보여준다.
increaseCounter(): EdtiText값을 매개변수 number로 Int타입으로 숫자를 입력해서 값을 증가시키는걸 알수있다.
package com.example.databinding.viewmodel
import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel
enum class Popularity {
NORMAL,
POPULAR,
STAR
}
class MyViewModel(
private val repository: Repository
) : ViewModel() {
val counterFromRepository = repository.getCounter()
fun increaseCounter(number:Int) {
repository.increaseCounter(number)
}
val popularity = Transformations.map(counterFromRepository) {
when {
(it > 50) -> Popularity.STAR
(it > 10) -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
}
viewmodel은 repositroy의 요청받는 데이터를 가져와준다
뷰모델은 누구한테 가져왓는지 데이터를 신경쓸 필요가 없어진다
뷰모델에서는 초기값을 전달받을수없기때문에 팩토리클래스를 생성합니다.
package com.example.databinding.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
@Suppress("UNCHECKED_CAST")
class ViewModelFactory(
private val repository: Repository
): ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(repository) as T
}
throw IllegalArgumentException("ViewModel Class Not Found")
}
}
isAssignbleFrom에서 Myviewmodel이 맞으면 Repository를 담아서 viewmodel로 반환해주기 때문에 팩토리를 통해서 뷰모델이 만들어집니다.
뷰모델을 통해 뷰를 작성한다.
package com.example.databinding
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import com.example.databinding.databinding.ActivityMainBinding
import com.example.databinding.viewmodel.MyViewModel
import com.example.databinding.viewmodel.RepositoyImpl
import com.example.databinding.viewmodel.ViewModelFactory
class MainActivity : AppCompatActivity() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding =
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val repository = RepositoyImpl(10)
val factory = ViewModelFactory(repository)
myViewModel = ViewModelProvider(this,factory)[MyViewModel::class.java]
//LiveData를 관측하기위해 lifecycleowner정의
//xml 데이터뷰를 가지고있는 viewmodel 를지정.
binding.lifecycleOwner = this
binding.viewmodel = myViewModel
binding.plusbutton.setOnClickListener {
val input = binding.editText.text.toString().toInt()
myViewModel.increaseCounter(input)
}
}
}
좋아요 버튼을 클릭햇을때 input이라는 변수를 만들어서 EditTable 에서 얻은 문자열 을 정수형으로 바꿔 뷰모델에 increasecounter() 메서드를 구현되는걸볼수있다.
- 결과물
- 초기값 10 으로 설정
- 좋아요수 만큼 이미지 색상 변경
'Android Jetpack > AAC' 카테고리의 다른 글
DataBinding 과 BindingApdater (0) | 2023.01.16 |
---|---|
ViewModel 과 LiveData (0) | 2023.01.12 |
DataBinding 사용법 (0) | 2023.01.12 |
뷰 바인딩 ViewBinding 사용법 (0) | 2022.12.13 |