问题描述
我已经实现了一个自定义 ArrayAdapter
,覆盖了 addAll
方法,以便我可以检测何时设置了项目。但我重写的 addAll
方法从未被调用:
class MyAdapter(
val context: Context,var items: MutableList<Any>
) : ArrayAdapter<Any>(context,R.layout.my_adapter_item,items) {
//this override never called
override fun addAll(collection: MutableCollection<out Any>) {
Log.d("add all called","MyAdapter")
}
//neither is this one
override fun addAll(vararg items: Any?) {
super.addAll(*items)
Log.d("add all called","MyAdapter")
}
}
在我的活动中,一旦加载了项目,我就会在适配器上调用 addAll
:
class MyActivity: AppCompatActivity() {
private lateinit var binding: MyActivityLayoutBinding
private lateinit var adapter: MyAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = MyActivityLayoutBinding.inflate(layoutInflater)
adapter = MyAdapter(this,mutablelistof())
binding.myAutoCompleteTextView.adapter = adapter
//load data and observe,then call onDataLoaded
}
private fun onDataLoaded(items: MutableList<Any>) {
adapter.clear()
//DOES NOT CALL EITHER overridden addAll method
adapter.addAll(items)
adapter.notifyDataSetChanged()
}
}
当我从 addAll
调用 MyAdapter
时,为什么在 addAll
中都没有调用被覆盖的 MyActivity
方法?
我发现检测项目何时设置的唯一方法是使用 setter 将 items
移动到 var
中:
class MyAdapter(
val context: Context
//pass empty list to super ArrayAdapter
) : ArrayAdapter<Any>(context,mutablelistof()) {
var items: MutableList<Any> = mutablelistof()
set(value) {
field = value
Log.d("you set items!","MyAdapter")
}
}
当然,这意味着我不能从 addAll
调用 MyActivity
,而是必须直接设置 items 属性:adapter.items = items
。
这感觉很荒谬。我只想检测何时通过 addAll
设置项目。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)