gpt4 book ai didi

android - 从 ViewTreeObserver 中移除监听器

转载 作者:IT老高 更新时间:2023-10-28 23:38:47 29 4
gpt4 key购买 nike

我需要监听一个确切的全局布局事件来初始设置正确的滚动位置。在搜索了一下为什么我对 scrollTo(x,y) 的调用似乎被忽略后,我发现只有知道整个布局后才能以有意义的方式调用这些。所以我正在注册一个 GlobalLayoutListener 并将我的调用推迟到 scrollTo()

问题是,我只想滚动一次。所以我想我可以简单地调用 removeGlobalOnLayoutListener() 来停止监听。这导致了一个异常:IllegalStateException: This ViewTreeObserver is not alive, call getViewTreeObserver() again。所以我认为我很好,如果观察者不活着,它不会触发任何事件。但不幸的是:每次布局发生某种变化时,我的 View 都会滚动。

我当前的代码迭代如下所示。我可以改变什么来确保对 scrollToGridPos() 的调用只发生一次?我知道我可以在内部类中添加一个本地字段 mHasFired 但这对我来说似乎很肮脏......

final ViewTreeObserver vto = mLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
scrollToGridPos(getCenterPoint(), false);
if (vto.isAlive()) {
vto.removeGlobalOnLayoutListener(this);
}
}
});

最佳答案

您应该只在 onGlobalLayout() 中使用 mLayout.getViewTreeObserver(),而不是尝试访问 old 那个。例如。

mLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
scrollToGridPos(getCenterPoint(), false);
mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});

关于android - 从 ViewTreeObserver 中移除监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192686/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com