Call function after navigateUp or dismissing DialogFragment

459 Views Asked by At

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:

  1. 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.)

  2. Refresh this list after navigateUp() called in AddExerciseToTrainingFragment. 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

}

1

There are 1 best solutions below

2
Yegorf On
  1. You can refresh your view in onDestroy() method of your DialogFragment.
  2. To "refresh" the list, use notifyDataSetChanged() method of your recyclers adapter.