在 navigationUp 或关闭 DialogFragment 后调用函数

问题描述

嗨,我在我的应用程序中使用函数 loadExercises() 将数据设置为 recyclerview。对于我的应用程序的每个部分,它都运行良好。但在一个特定的部分,我需要两件特定的事情:

  1. DialogFragment dismiss() 方法后刷新视图。 (我正在该对话框中更新锻炼时间。此方法运行良好,并完成了它应该做的事情。)

  2. 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

}

解决方法

  1. 您可以在 DialogFragment 的 onDestroy() 方法中刷新视图。
  2. 要“刷新”列表,请使用回收站适配器的 notifyDataSetChanged() 方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...