【发布时间】:2014-11-29 07:45:06
【问题描述】:
我需要监听一个确切的全局布局事件来初始设置正确的滚动位置。在搜索了一下为什么我对scrollTo(x,y) 的调用似乎被忽略后,我发现只有知道整个布局后才能以有意义的方式调用这些。所以我正在注册一个GlobalLayoutListener 并将我的电话推迟到scrollTo()。
问题是,我只想滚动一次。所以我想我可以简单地拨打removeGlobalOnLayoutListener() 停止收听。这导致了异常:IllegalStateException: This ViewTreeObserver is not alive, call getViewTreeObserver() again。所以我认为我很好,如果观察者不活着,它不会触发任何事件。但不幸的是:每次布局发生某种变化时,我的视图都会滚动。
我当前的代码迭代如下所示。我可以改变什么来确保对scrollToGridPos() 的调用只发生一次?我知道我可以在内部类中添加一个本地字段mHasFired,但这对我来说似乎很肮脏......
final ViewTreeObserver vto = mLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
scrollToGridPos(getCenterPoint(), false);
if (vto.isAlive()) {
vto.removeGlobalOnLayoutListener(this);
}
}
});
【问题讨论】:
-
对我来说这似乎不是一个黑客。或者,如果您可以覆盖它,您也可以在
View.onLayout中执行相同的操作。这似乎更适合我。
标签: android