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

关于ListView的getView方法:能否重写加变量及适配器引用问题

解答你的两个Adapter相关问题

首先直接回应你的第一个问题:不能通过重写getView函数来在方法签名中添加变量。因为Android中Adapter接口(比如BaseAdapter)定义的getView方法签名是固定的:

fun getView(position: Int, convertView: View?, parent: ViewGroup): View

重写方法必须严格遵循原有的方法签名,否则编译器会把它当成一个新的重载方法,而系统在调用Adapter的getView时,仍然会使用原签名的方法,你的自定义参数根本不会被用到,所以这种方式不可行。

接下来解决你核心的问题:在Google风格的.apply代码块中引用适配器本身。有两种简单可靠的方案:

方案1:提前保存适配器的引用

在进入.apply代码块之前,先把适配器的this引用赋值给一个局部变量,之后在代码块里直接使用这个变量即可:

override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
    val selfAdapter = this // 保存当前适配器的引用
    return (convertView ?: layoutInflater.inflate(R.layout.my_layout, parent, false)).apply {
        // 绑定position对应的内容到View的逻辑
        // ...
        
        // 调用适配器的notifyDataSetChanged
        selfAdapter.notifyDataSetChanged()
    }
}

方案2:使用带标签的this引用

Kotlin支持通过类名标签来明确指定this的指向,在.apply代码块中,用this@你的Adapter类名就能直接引用适配器对象:

class MyCustomAdapter : BaseAdapter() {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        return (convertView ?: layoutInflater.inflate(R.layout.my_layout, parent, false)).apply {
            // 绑定内容的逻辑
            // ...
            
            // 用类名标签指定适配器的this
            this@MyCustomAdapter.notifyDataSetChanged()
        }
    }

    // 实现Adapter其他必要的方法(getCount、getItem等)
}

额外提醒

这里要多说一句:尽量避免在getView方法中调用notifyDataSetChanged()。因为这个方法会触发ListView重新刷新所有可见项,而getView本身就是刷新过程中被调用的方法,这样很容易导致无限循环或者严重的性能问题。如果需要更新数据,建议在适配器外部的合适时机(比如数据集合修改完成后)调用notifyDataSetChanged()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:24:23