为什么 RecyclerView.OnScrollListener 不是接口而是抽象 class?
Why RecyclerView.OnScrollListener is not an interface but an abstract class?
要在 RecyclerView
中实施 Endless Scroll 模式,我想创建一个像
这样的 class
public class EndlessScrollAdapter<VH extends ViewHolder>
extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener {
}
因为EndlessScrollAdapter
应该同时负责数据和滚动事件处理,这是最方便的实现方式。
但是,因为在recyclerview-v7-21.0.3
中,OnScrollListener
是这样声明的
/**
* An OnScrollListener can be set on a RecyclerView to receive messages
* when a scrolling event has occurred on that RecyclerView.
*
* @see RecyclerView#setOnScrollListener(OnScrollListener)
*/
abstract static public class OnScrollListener {
/**
* Callback method to be invoked when RecyclerView's scroll state changes.
*
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
public void onScrollStateChanged(RecyclerView recyclerView, int newState){}
/**
* Callback method to be invoked when the RecyclerView has been scrolled. This will be
* called after the scroll has completed.
*
* @param recyclerView The RecyclerView which scrolled.
* @param dx The amount of horizontal scroll.
* @param dy The amount of vertical scroll.
*/
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
}
我无法让 EndlessScrollAdapter
实现 OnScrollListener
。
所以正如标题所说,OnScrollListener
是一个 class 而不是一个界面有什么好的理由吗?因为我觉得应该是接口。
I can't make EndlessScrollAdapter implement OnScrollListener.
这是真的,但是您可以有一个专用的 class extends RecyclerView.OnScrollListener
(RecyclerView.OnScrollListener
的具体实例)。例如
private class MyScrollListener extends RecyclerView.OnScrollListener {
// abstract methods implemenations
}
而你需要的只是
mRecyclerView.addOnScrollListener(new MySCrollListener());
我有同样的问题,它绝对是设计好的,正如这个错误报告中所回答的那样:
https://code.google.com/p/android/issues/detail?id=79283
Abstract classes allow frameworks to add new methods without breaking existing implementations.
也可以在这里找到介绍它的差异:
https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/
This change adds RecyclerView as a first parameter to the scroll related callbacks.
It also fxies a bug where scroll callback was being called w/ the intended scroll
amount instead of the real scroll amount.
I also changed it to be an abstract class instead of an interface to make future
changes easier.
不确定我个人是否同意更改,但是你去吧。
yourRecyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
避免在您的方法中设置侦听器的想法
...
recyclerView.addOnScrollListener(new ScrollListener());
...
并创建一个内部监听器class
private class ScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState){
// your code there
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
// your code there
}
}
要在 RecyclerView
中实施 Endless Scroll 模式,我想创建一个像
public class EndlessScrollAdapter<VH extends ViewHolder>
extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener {
}
因为EndlessScrollAdapter
应该同时负责数据和滚动事件处理,这是最方便的实现方式。
但是,因为在recyclerview-v7-21.0.3
中,OnScrollListener
是这样声明的
/**
* An OnScrollListener can be set on a RecyclerView to receive messages
* when a scrolling event has occurred on that RecyclerView.
*
* @see RecyclerView#setOnScrollListener(OnScrollListener)
*/
abstract static public class OnScrollListener {
/**
* Callback method to be invoked when RecyclerView's scroll state changes.
*
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
public void onScrollStateChanged(RecyclerView recyclerView, int newState){}
/**
* Callback method to be invoked when the RecyclerView has been scrolled. This will be
* called after the scroll has completed.
*
* @param recyclerView The RecyclerView which scrolled.
* @param dx The amount of horizontal scroll.
* @param dy The amount of vertical scroll.
*/
public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
}
我无法让 EndlessScrollAdapter
实现 OnScrollListener
。
所以正如标题所说,OnScrollListener
是一个 class 而不是一个界面有什么好的理由吗?因为我觉得应该是接口。
I can't make EndlessScrollAdapter implement OnScrollListener.
这是真的,但是您可以有一个专用的 class extends RecyclerView.OnScrollListener
(RecyclerView.OnScrollListener
的具体实例)。例如
private class MyScrollListener extends RecyclerView.OnScrollListener {
// abstract methods implemenations
}
而你需要的只是
mRecyclerView.addOnScrollListener(new MySCrollListener());
我有同样的问题,它绝对是设计好的,正如这个错误报告中所回答的那样:
https://code.google.com/p/android/issues/detail?id=79283
Abstract classes allow frameworks to add new methods without breaking existing implementations.
也可以在这里找到介绍它的差异:
https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/
This change adds RecyclerView as a first parameter to the scroll related callbacks.
It also fxies a bug where scroll callback was being called w/ the intended scroll amount instead of the real scroll amount.
I also changed it to be an abstract class instead of an interface to make future changes easier.
不确定我个人是否同意更改,但是你去吧。
yourRecyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
避免在您的方法中设置侦听器的想法
...
recyclerView.addOnScrollListener(new ScrollListener());
...
并创建一个内部监听器class
private class ScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState){
// your code there
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
// your code there
}
}