Hi I'm using function loadExercises()
in my app for setting data to recyclerview. For every part of my app it's working fine. But in one specific part I need two specific things:
Refresh view after
DialogFragment dismiss()
method. (I'm updating exercise time in that dialog. This method is working fine and does what it should do.)Refresh this list after
navigateUp()
called inAddExerciseToTrainingFragment
. This fragment is another recyclerview full of exercises. On click it shows DialogFragment, which adds exercise to training a sets specific time. Again this method works, but I'm unable to "refresh" the list after navigating up.
The data is stored in the Firebase Cloud Firestore.
Function for loading exercises (I'm calling this one in onStart()
and onResume()
):
fun loadExercises() {
trainingsViewModel.loadExercisesInTraining().observe(viewLifecycleOwner, { result ->
binding.result = result
if (result is Result.Success) {
adapter.submitList(result.data)
}
})
}
Function loadExercisesInTraining from ViewModel:
private val coroutineContext = viewModelScope.coroutineContext + Dispatchers.IO
fun loadTrainings(): LiveData<Result<List<Training>>> = liveData(coroutineContext) {
emit(Result.Loading)
val result = trainingsRepository.getTrainings()
if (result is Result.Success) {
emit(result)
}
}
Recycler view adapter:
class ExerciseInTrainingAdapter(
private val onClick: ((ExerciseInTraining) -> Unit)? = null,
private val fragment: TrainingDetailFragmentExercises
) : DataBoundListAdapter<ExerciseInTraining, ExerciseInTrainingItemBinding>(
diffCallback = object : DiffUtil.ItemCallback<ExerciseInTraining>() {
override fun areItemsTheSame(
oldItem: ExerciseInTraining,
newItem: ExerciseInTraining
): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(
oldItem: ExerciseInTraining,
newItem: ExerciseInTraining
): Boolean {
return oldItem == newItem
}
}
) {
private lateinit var viewModel: TrainingsViewModel
private lateinit var exerciseViewModel: ExercisesViewModel
fun setViewModel(viewModel: TrainingsViewModel) {
this.viewModel = viewModel
}
fun setViewModel(viewModel: ExercisesViewModel) {
this.exerciseViewModel = viewModel
}
override fun createBinding(parent: ViewGroup): ExerciseInTrainingItemBinding {
return DataBindingUtil.inflate<ExerciseInTrainingItemBinding>(
LayoutInflater.from(parent.context),
R.layout.exercise_in_training_item,
parent, false
).apply {
this.buttonDelete.setOnClickListener {
this.exercise?.let { deleteExercise(this.root, it.id.toString()) }
}
this.root.setOnClickListener {
this.exercise?.let { goToExerciseDetail(this.root, it) }
}
this.exerciseTime.setOnClickListener {
this.exercise?.let { setExerciseTime(this.root, it) }
}
}
}
override fun bind(binding: ExerciseInTrainingItemBinding, item: ExerciseInTraining) {
binding.exercise = item
}
//methods implementation
}