데이터 바인딩 - Repository pattern 적용해보기.

2023. 2. 16. 15:33Android 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