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

Kotlin中作为PagingAdapter监听器的内联函数如何引用自身完成移除

问题根因

你之前的写法存在两个核心问题:

  1. lambda 表达式中的 this 默认指向外层类实例(如 Activity、Fragment 等),而非当前 lambda 自身实例,因此传入 this 无法匹配到你添加的监听器,移除逻辑自然不生效。
  2. 第二种写法把匿名函数嵌套在了 lambda 块内部,相当于你传给 addLoadStateListener 的是外层无用的 lambda,内部定义的匿名函数根本没有被注册为监听器,当然不会触发。

正确实现方案

Kotlin 中函数类型的实例无法直接自引用,我们可以通过先声明监听器变量、再通过闭包访问变量引用的方式实现自我移除,有两种常用写法:

写法1:使用 lateinit 声明(适合确定会初始化的场景)

// 先声明监听器变量
lateinit var loadStateListener: (CombinedLoadStates) -> Unit
// 赋值监听器逻辑,内部引用自身变量完成移除
loadStateListener = { combinedLoadStates ->
    // 此处编写你的业务逻辑
    // 触发后移除自身
    myPagingAdapter.removeLoadStateListener(loadStateListener)
}
// 注册监听器
myPagingAdapter.addLoadStateListener(loadStateListener)

写法2:使用可空类型声明(适合空安全要求更高的场景)

// 声明可空的监听器变量
private var loadStateListener: ((CombinedLoadStates) -> Unit)? = null

// 注册逻辑
loadStateListener = { combinedLoadStates ->
    // 此处编写你的业务逻辑
    // 触发后移除自身
    loadStateListener?.let {
        myPagingAdapter.removeLoadStateListener(it)
        loadStateListener = null // 置空避免内存泄漏
    }
}
loadStateListener?.let { myPagingAdapter.addLoadStateListener(it) }

// 可选:如果监听器还没触发就销毁页面,主动移除避免泄漏
override fun onDestroy() {
    super.onDestroy()
    loadStateListener?.let { myPagingAdapter.removeLoadStateListener(it) }
    loadStateListener = null
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:06:04