为了检测app bar折叠的完成,我调用了addOnOffsetChangedListener.在监听器的onOffsetChanged中,我抓住并处理完成崩溃的时刻.然后我需要停止监听偏移变化.
在大多数示例中,这里是从onOffsetChanged内部调用removeOnOffsetChangedListener(this).但是看看AppBarLayout.java我看到:
private void dispatchOffsetUpdates(int offset) {
// Iterate backwards through the list so that most recently added listeners
// get the first chance to decide
if (mListeners != null) {
for (int i = 0, z = mListeners.size(); i < z; i++) {
final OnOffsetChangedListener listener = mListeners.get(i);
if (listener != null) {
listener.onOffsetChanged(this, offset);
}
}
}
}
因此,如果安装了多个侦听器,则调用removeOnOffsetChangedListener(this)自然会导致IndexOutOfBoundsException.
我错过了什么吗?有没有安全的方法可以“取消订阅”来收听偏移更新?
最佳答案 有趣的是,如果他们的代码实际上做了评论所说的话,那就不会有问题了.无论如何,我们可以通过在Runnable中调用removeOnOffsetChangedListener()并将其发布到onOffsetChanged()中的AppBarLayout来推迟删除,而不是直接在那里调用它.
例如:
AppBarLayout.OnOffsetChangedListener listener = new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(final AppBarLayout abl, int offset) {
abl.post(new Runnable() {
@Override
public void run() {
abl.removeOnOffsetChangedListener(listener);
}
}
);
}
};