如何解决在 navigationUp 或关闭 DialogFragment 后调用函数
嗨,我在我的应用程序中使用函数 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() 方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。