如何在Fragment的Dialog中隐藏Adapter内的ProgressBar?
问题分析与解决方案
核心问题
你的代码存在执行顺序倒置的问题:在ViewHolder的点击事件里,先触发Fragment的点击回调(你在回调里尝试隐藏ProgressBar),紧接着又调用了preparingDetailProgressBar.visible(),导致刚设置的隐藏操作被立刻覆盖,进度条始终处于显示状态。
修复步骤
- 调整ViewHolder点击事件的执行顺序
先调用visible()显示进度条,再触发Fragment的回调:
class PreparedViewHolder(private val binding: ItemPreparingBinding) : RecyclerView.ViewHolder(binding.root) { fun bind( data: PreparedOrdersResponse, _preparedOnItemClickListener: PreparedOnItemClickListener, preparedOnItemDetailClickListener: PreparedOnItemDetailClickListener ) { binding.apply { detailAreaLinearPreparing.setOnClickListener { // 先显示进度条 preparingDetailProgressBar.visible() preparedOnItemDetailClickListener.onClick( data, it, binding.preparingDetailProgressBar ) } linearTime.setOnClickListener { // 先显示进度条 preparingDetailProgressBar.visible() preparedOnItemDetailClickListener.onClick( data, it, binding.preparingDetailProgressBar ) } } } }
- 确认View扩展函数的正确性
检查visible()和gone()扩展函数是否正确实现:
fun View.visible() { visibility = View.VISIBLE } fun View.gone() { visibility = View.GONE }
- Dialog中的隐藏操作保持不变
你在detailOrderDialog里调用preparingDetailProgressBar.gone()的逻辑是正确的,调整顺序后即可生效。
额外排查点
如果调整顺序后仍无效,可检查:
- ProgressBar是否被布局中的其他View遮挡
- 布局文件中ProgressBar的
visibility初始属性是否存在冲突 - 确保所有操作都在主线程执行(当前代码默认在主线程,无需额外处理)
内容的提问来源于stack exchange,提问作者Ömer Seyfettin Yavuzyiğit
相关产品推荐
相关产品推荐

