关于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
相关产品推荐
相关产品推荐

