エンドレススクロールパターンをRecyclerView
に実装するには、次のようなクラスを作成します。
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
がインターフェイスではなくクラスになる理由はありますか?インターフェースだと思うから。
私は同じ質問をしましたが、このバグレポートで回答されているように、それは間違いなく設計どおりです。
https://code.google.com/p/Android/issues/detail?id=7928
抽象クラスにより、フレームワークは既存の実装を壊すことなく新しいメソッドを追加できます。
また、それを導入した差分はここにあります:
https://Android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/
この変更により、RecyclerViewが最初のパラメーターとしてスクロール関連のコールバックに追加されます。
また、実際のスクロール量ではなく、意図したスクロール量でスクロールコールバックが呼び出されていたバグも修正されました。
また、将来の変更を容易にするために、インターフェースではなく抽象クラスに変更しました。
個人的にはこの変更に同意するかどうかはわかりませんが、まだあります。
EndlessScrollAdapterにOnScrollListenerを実装させることはできません。
それは本当ですが、extends RecyclerView.OnScrollListener
(RecyclerView.OnScrollListener
の具象インスタンス)という専用クラスを使用できます。例えば
private class MyScrollListener extends RecyclerView.OnScrollListener {
// abstract methods implemenations
}
そして必要なのは
mRecyclerView.addOnScrollListener(new MySCrollListener());
あなたのメトッドにリスナーを設定することを避けるべきアイデア
...
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
}
}
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);
}
});