Android Dev/Navigation / / 2021. 5. 22. 15:12

Fragment Procedure with Navigation + Databinding + Firebase 예제

Fragment Procedure with Navigation + Databinding (해당 포스팅 참조)

에 대한 해당 부분이 일부 구성되어있다고 가정하고 firebase에서 온 querySnapshot을 xml에 넘기는 예제를 구성함

 

 

 

1. Firebase 호출은 Viewmodel에서 구성합니다

 

@HiltViewModel
class TodayPersonEmotionViewModel @Inject constructor() :ViewModel() {

val topEmotions = MutableLiveData<EmotionTop3Sets>()
private var _fid = MutableLiveData<String>()

fun setFid (fid : String){
_fid.value = fid
}

fun setEmotionSet(_emotionsSets :EmotionTop3Sets){
topEmotions.value = _emotionsSets
}


fun callEmotionsFromFirebase(){
FirebaseFirestore.getInstance()
.collection("today_person")
.document(_fid.value?: "")
.collection("emotions")
.orderBy("shard1", Query.Direction.DESCENDING)
.limit(3)
.get()
.addOnSuccessListener { querySnapshot ->
var counter = 0
val topEmotions = EmotionTop3Sets()

querySnapshot?.documents?.forEach { aDoc ->
val enumEmotion = Functions.emotionEnumReturner(aDoc.id)
val anEmotionSet = EmotionSet(
counter = aDoc.data?.get("shard1") as Long?,
emotionNameIs = Functions.emotionTitleLoader(enumEmotion),
emotionImageIs = Functions.emotionIconImageLoader(enumEmotion)
)

when(counter)
{
0 -> { topEmotions.first = anEmotionSet }
1 -> { topEmotions.second = anEmotionSet }
2 -> { topEmotions.third = anEmotionSet }
}
counter++
}

setEmotionSet(topEmotions)
}
}



}

 

 

 

위의 예제에서 

val topEmotions = MutableLiveData<EmotionTop3Sets>() 를 레이아웃 xml에 전달합니다

 

2. Fragment/Activity

 

val binding = FragmentTodayPersonDetailBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this

 

바인딩 해주고 viewmodel의 method를 호출합니다

 

 

 

 

3. xml에 databinding을 해줍니다.

 

여기서 emotionSet 를 사용하는 블록은 include 되어있고 여기에 mutableLivedata를 전달합니다.

 

아래는 상위 레이아웃의 데이터바인딩 부분

(즉 상위 레이아웃만 livedata로 엮어주고 그 value를 하위 레이아웃에 사용해도 변경되는 값이 들어감)

 

 

아래는 하위레이아웃의 데이터바인딩 부분

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유