在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
成为一个类而不是一个接口有什么好的理由吗?因为我认为它应该是一个界面。
答案 0 :(得分:14)
我有同样的问题,这绝对是设计的,正如这个错误报告中所回答的那样:
https://code.google.com/p/android/issues/detail?id=79283
抽象类允许框架在不破坏现有实现的情况下添加新方法。
引入它的差异也可以在这里找到:
https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/
此更改将RecyclerView添加为滚动相关回调的第一个参数。
它还解决了一个错误,其中滚动回调被调用w /预期的滚动 数量而不是实际滚动量。
我还把它改成了一个抽象类而不是一个接口来创造未来 变化更容易。
不确定我个人同意这一变化,但是你去了。
答案 1 :(得分:6)
我无法使EndlessScrollAdapter实现OnScrollListener。
这是真的,但你可以拥有一个extends RecyclerView.OnScrollListener
(RecyclerView.OnScrollListener
的具体实例)的专用类。 E.g
private class MyScrollListener extends RecyclerView.OnScrollListener {
// abstract methods implemenations
}
,你需要的只是
mRecyclerView.addOnScrollListener(new MySCrollListener());
答案 2 :(得分:1)
避免在metdod中设置监听器的想法
...
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
}
}
答案 3 :(得分:0)
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);
}
});