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 |