18

Endless Scroll パターンをに実装するには、RecyclerView次のようなクラスを作成したい

public class EndlessScrollAdapter<VH extends ViewHolder> 
        extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener {
}

はデータとスクロール イベントの両方の処理を担当する必要があるためEndlessScrollAdapter、これが最も便利な実装方法です。

しかし、 inはこのようrecyclerview-v7-21.0.3OnScrollListener宣言されているため、

/**
 * 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タイトルが示すように、インターフェースではなくクラスである正当な理由はありますか? インターフェースであるべきだと思うからです。

4

4 に答える 4

14

このバグレポートで回答されているように、同じ質問がありましたが、間違いなく設計どおりです。

https://code.google.com/p/android/issues/detail?id=79283

抽象クラスを使用すると、フレームワークは既存の実装を壊さずに新しいメソッドを追加できます。

また、それを導入した差分は次の場所にあります。

https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/

この変更により、RecyclerView が最初のパラメーターとしてスクロール関連のコールバックに追加されます。

また、実際のスクロール量ではなく意図したスクロール量でスクロール コールバックが呼び出されていたバグも修正されました。

また、将来の変更を容易にするために、インターフェイスではなく抽象クラスに変更しました。

個人的には変更に同意するかどうかはわかりませんが、まあいいでしょう。

于 2015-02-20T19:39:15.923 に答える
6

EndlessScrollAdapter に OnScrollListener を実装させることはできません。

extends RecyclerView.OnScrollListenerそれは本当ですが、 (の具体的なインスタンス )専用のクラスを持つことができますRecyclerView.OnScrollListener。例えば

private class MyScrollListener extends RecyclerView.OnScrollListener {
   // abstract methods implemenations
}

そしてあなたが必要とするものはただ

mRecyclerView.addOnScrollListener(new MySCrollListener());
于 2015-02-20T19:32:06.930 に答える
1
 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);
        }
    });
于 2016-05-30T07:21:58.063 に答える
0

メソッドにリスナーを設定することを避けるためのアイデア

...
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
    }
}
于 2016-06-22T13:07:58.023 に答える