问题描述
嗨,我在我的应用程序中使用函数 loadExercises()
将数据设置为 recyclerview。对于我的应用程序的每个部分,它都运行良好。但在一个特定的部分,我需要两件特定的事情:
-
在
DialogFragment dismiss()
方法后刷新视图。 (我正在该对话框中更新锻炼时间。此方法运行良好,并完成了它应该做的事情。) -
在
navigateUp()
中调用AddExercisetoTrainingFragment
后刷新此列表。这个片段是另一个充满练习的回收站视图。单击它会显示 DialogFragment,它将练习添加到训练集的特定时间。这种方法再次有效,但我无法在向上导航后“刷新”列表。
数据存储在 Firebase Cloud Firestore 中。
加载练习的函数(我在 onStart()
和 onResume()
中称之为):
fun loadExercises() {
trainingsviewmodel.loadExercisesInTraining().observe(viewLifecycleOwner,{ result ->
binding.result = result
if (result is Result.Success) {
adapter.submitList(result.data)
}
})
}
来自 viewmodel 的函数 loadExercisesInTraining:
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)
}
}
回收者视图适配器:
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
}
解决方法
- 您可以在 DialogFragment 的 onDestroy() 方法中刷新视图。
- 要“刷新”列表,请使用回收站适配器的 notifyDataSetChanged() 方法。