I am using Jetpack navigation component. I have a list with pagination and with same list I am populating map markers. I am using live data with view model. I am observing with viewLifecycleOwner. As per jetpack navigation component, fragment will replace not add, so my fragment onViewCreated called whenever I switch from Fragment A to B, due to this all marker render heavy operations called again.
I tried in view model with viewModelScope.launch {} but the result is same.
The last thing which is working for me is: I defined a bool for this firsTime. So I started observing when firstTime flag is true, once observer is set I called this flag to false and this is preventing this heavy operation again and again.
So question is: setting flag is fine? or is there is any other better solution.
My View Model:
val gymBuddiesPagingLiveData: MutableLiveData<ViewStatePaging<MutableList<SingleGymBuddyItem>>> = MutableLiveData<ViewStatePaging<MutableList<SingleGymBuddyItem>>>()
private val localPagingGymBuddiesMobile: MutableList<SingleGymBuddyItem> = mutableListOf()
private var gymBuddiesPage = 1
suspend fun getPageGymBuddiesMobile(gymBuddyFilter: GymBuddiesFilter){
viewModelScope.launch {
if(gymBuddiesPage == 1){
gymBuddiesPagingLiveData.postValue(ViewStatePaging.FirstPage())
}
else{
gymBuddiesPagingLiveData.postValue(ViewStatePaging.Loading())
}
val page = PaginatorInput(gymBuddiesPage, PAGING_LIMIT)
homeRepository.getGymBuddiesMobile(page, gymBuddyFilter).collect {
when (it) {
is Resource.Success -> {
gymBuddiesPage++
val data = it.data.gymBuddiesMobile.list?.map {
SingleGymBuddyItem(
it
)
}
if(localPagingGymBuddiesMobile.isEmpty() && (data?.isEmpty() == true)){
gymBuddiesPagingLiveData.value = ViewStatePaging.NoResult()
}
else{
if(!data.isNullOrEmpty()){
localPagingGymBuddiesMobile.addAll(data)
gymBuddiesPagingLiveData.value = ViewStatePaging.Success(localPagingGymBuddiesMobile)
//pagingGymBuddiesMarkers.addAll(transformGymBuddyMarkers(data))
//gymBuddiesMarkersLiveData.value = pagingGymBuddiesMarkers
}
else{
gymBuddiesPagingLiveData.value = ViewStatePaging.LastPage()
}
}
}
is Resource.Failed -> {
gymBuddiesPagingLiveData.value = ViewStatePaging.Error(it.message)
}
}
}
}
}
And here is my observer in fragment:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
observeEvents()
}
private fun observeEvents() {
mViewModel.events.observe(viewLifecycleOwner) { response ->
when(response) {
is ViewState.Loading -> {
binding.progressEvent.visible()
binding.noItemFoundTv.gone()
}
is ViewState.Error -> {
setNoDataView()
}
is ViewState.Success -> {
binding.noItemFoundTv.gone()
if(response.value.isNullOrEmpty()){
setNoDataView()
}
else{
listEvents.clear()
listEvents.addAll(response.value!!)
listAdapter.addAll(listEvents)
homeAdapter.addAll(listEvents.filter { it.type == 2 })
setDataView()
val mapList = mutableListOf<SingleEvent>()
listEvents.forEach {
if(it.type == 2){
it.singleEvent?.let { it1 -> mapList.add(it1) }
}
}
if(markersOrderNumbers.size != mapList.size){
populateMarkers(mapList)
}
mapOperations()
}
}
}
}
}