我正在阅读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) {}
}
现在,尽管进行了此更改,但即使未实现
MyOwnOnItemTouchListener
,onMultiTouchEvent
仍将编译,因为即使在任何时候调用MyOwnOnItemTouchListener.onMultiTouchEvent()
,它都将仅使用其父级SimpleOnItemTouchListener
的(空)实现。并且您的应用将继续运行💪
现在,回答您的确切问题:
是。尽管这里的“默认行为”是“什么也不做”,所以如果您想实际执行某项操作,则仍然需要在自己的侦听器中实现这些方法。
对,就是这样。
是。
是。他们提供的“默认行为”只是“什么都不做”。这只是避免编译失败的一种方法。
您仍然必须以有意义的方式实现这些方法。但是现在,如果引入了新方法,您将拥有一个安全网。
我想说您实际上了解了它的要点,只是空的默认实现令人困惑。
关于java - 具有将来兼容性的类,不会破坏以后的修改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55082703/