Android 为什么RecyclerView.OnScrollListener不是一个接口而是一个抽象类?
要在Android 为什么RecyclerView.OnScrollListener不是一个接口而是一个抽象类?,android,android-recyclerview,endlessscroll,Android,Android Recyclerview,Endlessscroll,要在RecyclerView中实现无休止的滚动模式,我想创建一个类似 public class EndlessScrollAdapter<VH extends ViewHolder> extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener { } 我无法使EndlessScrollAdapter实现OnScrollListener 因此,正如标题所说,OnScr
RecyclerView
中实现无休止的滚动模式,我想创建一个类似
public class EndlessScrollAdapter<VH extends ViewHolder>
extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener {
}
我无法使EndlessScrollAdapter
实现OnScrollListener
因此,正如标题所说,OnScrollListener
成为类而不是接口有什么好的理由吗?因为我认为它应该是一个接口
我无法使EndlessScrollAdapter实现OnScrollListener
这是真的,但是您可以有一个专用类扩展RecyclerView.OnScrollListener
(一个RecyclerView.OnScrollListener
的具体实例)。例如
你需要的只是
mRecyclerView.addOnScrollListener(new MySCrollListener());
我也有同样的问题,它完全符合设计,正如在这个bug报告中所回答的: 抽象类允许框架在不破坏现有实现的情况下添加新方法 这里还可以找到引入它的差异: 此更改将RecyclerView作为第一个参数添加到与滚动相关的回调中 它还修复了一个bug,在该bug中,使用预期的滚动调用滚动回调 数量而不是实际的滚动数量 我还将其更改为一个抽象类,而不是一个接口,以使其更具未来性 变化更容易
就我个人而言,我不确定我是否同意这一改变,但你可以这样做。避免在你的谈话中设置听众的想法
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());
...
并创建一个内部侦听器类
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
}
}
虽然直接在recycler视图的实例上调用“setOnscrollListener”是不可取的,但这样做就像一个魅力。谢谢提交中提到的原因是“我还将其更改为一个抽象类,而不是一个接口,以使将来的更改更容易。”但不应基于未来进行这样的更改,因为在这种情况下,该类将永远不会更改,并且在其余生中肯定会成为一个接口。两年过去了,现在还是一样。
...
recyclerView.addOnScrollListener(new ScrollListener());
...
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
}
}