SimpleOnItemTouchListener

SimpleOnItemTouchListener

我正在阅读Android的RecyclerView的源代码,并且正在使用SimpleOnItemTouchListener并阅读有关此类的文档。但是我不确定我是否理解这个意思:



这是因为SimpleOnItemTouchListener实现了OnItemTouchListener并提供了一些默认行为吗?因此,如果OnItemTouchListener得到更新,则SimpleOnItemTouchListener仍将返回默认行为。

关于“如果界面可能会更改”的部分。他们在谈论OnItemTouchListener吗?

但是,SimpleOnItemTouchListener似乎只有空方法,仅此而已。

最佳答案

假设您有以下界面:

public interface OnItemTouchListener {
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
}

然后,您决定自己实现:
public class MyOwnOnItemTouchListener implements OnItemTouchListener {

    @Override
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        boolean result = doSomething(e);
        return result;
    }

    @Override
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        doSomethingElse(rv, e);
        doSomethingMore(rv);
    }

    @Override
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        if (disallowIntercept) {
            doADifferentThing();
        }
    }
}

一切顺利...
...直到六个月后,对OnItemTouchListener进行修改以引入一种新方法:
public interface OnItemTouchListener {
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
    // New method
    void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
}

突然您的应用程序将不再编译😱



而且这不是您的错,您什么也没做! 只是界面已更改,而您的代码不是的最新内容。

为避免此,API开发人员为您提供了“默认”实现类SimpleOnItemTouchListener,即保证始终与接口(interface)保持最新,并且您可以扩展:
public class SimpleOnItemTouchListener implements OnItemTouchListener {
    // empty, override in your class
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { return false; }
    // empty, override in your class
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
    // empty, override in your class
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}
}

因此,您可以执行以下操作,而不是直接实现接口(interface):
public class MyOwnOnItemTouchListener extends SimpleOnItemTouchListener { //extend Simple instead of implementing interface

    @Override
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        boolean result = doSomething(e);
        return result;
    }

    @Override
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        doSomethingElse(rv, e);
        doSomethingMore(rv);
    }

    @Override
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        if (disallowIntercept) {
            doADifferentThing();
        }
    }
}

现在,如果API开发人员在六个月内需要引入新方法,他们将更改两个类,以确保:
public interface OnItemTouchListener {
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept);
    // New method
    void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e);
}
public class SimpleOnItemTouchListener implements OnItemTouchListener {
    // empty, override in your class
    boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { return false; }
    // empty, override in your class
    void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
    // empty, override in your class
    void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}
    // New method
    // empty, override in your class
    void onMultiTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}
}

现在,尽管进行了此更改,但即使未实现MyOwnOnItemTouchListeneronMultiTouchEvent仍将编译,因为即使在任何时候调用MyOwnOnItemTouchListener.onMultiTouchEvent(),它都将仅使用其父级SimpleOnItemTouchListener的(空)实现。

并且您的应用将继续运行💪

现在,回答您的确切问题:



是。尽管这里的“默认行为”是“什么也不做”,所以如果您想实际执行某项操作,则仍然需要在自己的侦听器中实现这些方法。



对,就是这样。



是。



是。他们提供的“默认行为”只是“什么都不做”。这只是避免编译失败的一种方法。
您仍然必须以有意义的方式实现这些方法。但是现在,如果引入了新方法,您将拥有一个安全网。

我想说您实际上了解了它的要点,只是空的默认实现令人困惑。

关于java - 具有将来兼容性的类,不会破坏以后的修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55082703/

10-10 02:29