0

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 Answers1

0
  1. You can refresh your view in onDestroy() method of your DialogFragment.
  2. To "refresh" the list, use notifyDataSetChanged() method of your recyclers adapter.
Yegorf
  • 400
  • 2
  • 11
  • Hi, thanks I solved the 1. problem, but I have no idea, where should I call the notifyDataSetChanged() method. – Lukáš Paták Apr 03 '21 at 18:52
  • "Refresh this list after navigateUp() called in AddExerciseToTrainingFragment" - after navigateUp :) Can you describe the problem? – Yegorf Apr 03 '21 at 19:04