android – AppBarLayout:如何removeOnOffsetChangedListener

为了检测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);
                }
            }
        );
    }
};
点赞