Programing/Android

안드로이드 live data repository viewModel 실시간 데이터 바인딩

딩코딩 2024. 3. 12. 18:16

repository 데이터 보관소

class MyMemberRepository {
    // MutableLiveData를 사용하여 이미지 URL을 저장하는 LiveData
    private val _imageUrl = MutableLiveData<String?>()

    // 외부에서 이 Repository에 저장된 이미지 URL을 가져올 수 있는 LiveData
    fun getImageUrl(): LiveData<String?> {
        return _imageUrl
    }

    // 이미지 URL을 업데이트하고 LiveData에 알림을 보내는 메서드
    fun setImageUrl(newImageUrl: String?) {
        _imageUrl.postValue(newImageUrl) // postValue를 써야 UI부분 Main쓰레드에서 변경을 보장
    }

    // 싱글톤 패턴을 사용하여 Repository의 인스턴스를 생성하고 반환하는 companion object
    companion object {
        private var instance: MyMemberRepository? = null

        // 인스턴스를 가져오거나 생성하여 반환하는 메서드
        fun getInstance(): MyMemberRepository {
            if (instance == null) {
                instance = MyMemberRepository()
            }
            return instance!!
        }
    }
}

 

view 업데이트

// 데이터는 repository에서 받아온다.
// Toolbar에서 사용할 이미지 URL을 관찰하는 ViewModel
class ToolbarViewModel(private val repository: MyMemberRepository) : ViewModel() {
    // Repository에서 받아온 이미지 URL을 실시간으로 감지하는 LiveData
    val imageUrl: LiveData<String?>
        get() = repository.getImageUrl()

    // XML에서 이미지 URL을 설정할 때 호출되는 BindingAdapter
    companion object {
        @JvmStatic
        @BindingAdapter("imageUrl")
        fun loadImage(view: ImageView, imageUrl: String?) { //이미지가 변경되면 xml에서 다시 호출함
            // Glide를 사용하여 이미지 URL을 로드하고 설정
            val requestOptions = RequestOptions()
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                .skipMemoryCache(true)

            Glide.with(view.context)
                .load(imageUrl)
                .apply(requestOptions)
                .error(R.drawable.user_profile_teal)
                .into(view)
        }
    }
}


activity에서 실제로 그리는 부분 (onCreate)

val toolbarBinding: HomeToolbarBinding by lazy {HomeToolbarBinding.inflate(layoutInflater)}
  
fun setToolbar() {        
        // toolbar 함수에서 ViewModel 업데이트
        val myMember = MyMemberRepository.getInstance() //싱글톤
        val viewModel = ToolbarViewModel(myMember)
        toolbarBinding.viewModel = viewModel
        toolbarBinding.lifecycleOwner = this
        
        //repository에 image Url만 넣으면 알아서 view가 업데이트 된다.
        myMember.setImageUrl(PreferenceUtil.getString(Constant.MEMBER_IMAGE, ""))
       
}

'Programing > Android' 카테고리의 다른 글

안드로이드 텍스트 넘침 ...표시  (0) 2024.03.13
viewModel, binding을 사용하는 예제  (0) 2024.03.12
안드로이드 이미지 넣기  (0) 2023.11.02