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
    }
}