【发布时间】:2012-04-20 01:26:50
【问题描述】:
这是我的代码:
final Foo myFoo = new Foo(new Inner() {
@Override
callback(){
myFoo.bar();
}
});
(带有实际函数名)
final MyArrayAdapter aa = new MyArrayAdapter(new View.OnClickListener() {
@Override
onClick(){
aa.notifyDataSetChanged();
}
});
Java 给我一个关于 myFoo 可能没有被初始化的错误。有没有什么办法解决这一问题?我可以在构造对象时将回调设置为 null,然后再对其进行更改,但我希望有一种更简洁的方法。有任何想法吗? (如果 Foo 不是我写的,也没有暴露接口来改变回调,那也是行不通的)
如果有人好奇,在我的具体场景中,Foo 是一个 ArrayAdapter,bar 是 notifyDataSetChanged()。适配器显示的内容取决于数组中项目的值,并且这些值在单击时会发生变化。回调是clickListener。
【问题讨论】:
-
你不能只参考this.bar()或bar()吗?
-
不,我的实际代码比这个例子复杂,而且回调在另一个匿名内部类中
-
为什么要覆盖 notifyDataSetChanged?从 API 文档看来,您应该调用 myFoo.registerDataSetObserver(new DataSetObserver(){})。
-
当 ArrayAdapter 的数据中的一项发生变化时(由于点击它),ArrayAdapter 中其余的东西都需要重新绘制。有没有比调用 notifyDataSetChanged() 更好的方法?
-
你需要将 myFoo 传递给 Inner 的构造函数。修复它。
标签: java callback anonymous-types final