You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在RecyclerView Adapter类中监听Fragment的onResume方法?

当然有办法搞定这个需求啦!我给你整理了几种实用的实现方案,你可以根据自己项目的架构和需求来挑:

方案一:接口回调(最推荐的解耦方式)

这种方式能让Fragment和Adapter保持低耦合,是Android开发里的常规操作,适配大多数场景。步骤如下:

  1. 定义回调接口:可以放在Adapter内部或者单独文件里,用来传递Fragment的onResume事件
// 放在RecyclerViewAdapter内部更贴合逻辑
class RecyclerViewAdapter(private val dataList: List<String>) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {
    // 定义回调接口
    interface OnFragmentResumeListener {
        fun onFragmentResumed()
    }

    private var resumeListener: OnFragmentResumeListener? = null

    // 设置回调的方法
    fun setOnFragmentResumeListener(listener: OnFragmentResumeListener) {
        this.resumeListener = listener
    }

    // 适配器内部要执行的核心逻辑
    private fun doResumeLogic() {
        // 这里写你要执行的操作,比如刷新数据、滚动到指定位置、更新Item状态等
        notifyDataSetChanged()
    }

    // ... 省略ViewHolder、onCreateViewHolder、onBindViewHolder等常规代码
}
  1. 在Fragment中实现接口并触发回调:在你的Fragment里实现这个接口,在onResume时触发适配器的逻辑,记得在销毁时解绑避免内存泄漏
class YourFragment : Fragment(), RecyclerViewAdapter.OnFragmentResumeListener {
    private lateinit var adapter: RecyclerViewAdapter

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_your, container, false)
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        adapter = RecyclerViewAdapter(emptyList())
        recyclerView.adapter = adapter
        // 绑定回调
        adapter.setOnFragmentResumeListener(this)
        return view
    }

    override fun onResume() {
        super.onResume()
        // 触发适配器的回调逻辑
        resumeListener?.onFragmentResumed()
    }

    override fun onFragmentResumed() {
        adapter.doResumeLogic()
    }

    override fun onDestroyView() {
        super.onDestroyView()
        // 解绑回调,防止内存泄漏
        adapter.setOnFragmentResumeListener(null)
    }
}
方案二:使用LiveData(适合MVVM架构)

如果你的项目采用MVVM模式,用LiveData传递事件会更贴合架构,而且自带生命周期感知,完全不用担心内存泄漏问题。

  1. 在ViewModel中定义事件LiveData
class YourViewModel : ViewModel() {
    // 用MutableLiveData发送事件,对外暴露不可变的LiveData保证安全性
    private val _fragmentResumedEvent = MutableLiveData<Unit>()
    val fragmentResumedEvent: LiveData<Unit> = _fragmentResumedEvent

    // 发送事件的方法
    fun notifyFragmentResumed() {
        _fragmentResumedEvent.postValue(Unit)
    }
}
  1. Fragment中触发事件
class YourFragment : Fragment() {
    private val viewModel: YourViewModel by viewModels()
    private lateinit var adapter: RecyclerViewAdapter

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_your, container, false)
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        // 把LiveData和Fragment的生命周期所有者传给Adapter
        adapter = RecyclerViewAdapter(emptyList(), viewModel.fragmentResumedEvent, viewLifecycleOwner)
        recyclerView.adapter = adapter
        return view
    }

    override fun onResume() {
        super.onResume()
        // 通知ViewModel发送事件
        viewModel.notifyFragmentResumed()
    }
}
  1. Adapter中观察LiveData执行逻辑
class RecyclerViewAdapter(
    private val dataList: List<String>,
    resumedEvent: LiveData<Unit>,
    lifecycleOwner: LifecycleOwner
) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

    init {
        // 观察事件,收到通知后执行逻辑
        resumedEvent.observe(lifecycleOwner) {
            doResumeLogic()
        }
    }

    private fun doResumeLogic() {
        // 执行你的自定义操作
        notifyDataSetChanged()
    }

    // ... 省略常规Adapter代码
}
方案三:直接调用Adapter方法(简单但耦合度高)

如果你的项目规模小、逻辑简单,不想搞复杂的接口或LiveData,可以直接在Fragment里持有Adapter实例,在onResume时调用Adapter的公开方法。

class YourFragment : Fragment() {
    private lateinit var adapter: RecyclerViewAdapter

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_your, container, false)
        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        adapter = RecyclerViewAdapter(emptyList())
        recyclerView.adapter = adapter
        return view
    }

    override fun onResume() {
        super.onResume()
        // 直接调用Adapter的公开方法
        adapter.performResumeLogic()
    }
}

// Adapter中定义公开方法
class RecyclerViewAdapter(private val dataList: List<String>) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {
    // 供Fragment调用的公开方法
    fun performResumeLogic() {
        // 执行你的自定义逻辑
        notifyDataSetChanged()
    }

    // ... 省略常规Adapter代码
}

方案总结

  • 优先选接口回调:解耦性好,灵活度高,适配绝大多数常规项目;
  • MVVM架构选LiveData:贴合架构设计,生命周期安全,无内存泄漏风险;
  • 小项目快速实现选直接调用:简单粗暴,但Fragment和Adapter耦合度高,不适合复杂场景或需要复用Adapter的情况。

内容的提问来源于stack exchange,提问作者bensofter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:15:42