(1)スクロールイベント分類
リストのスクロールは、一般的に2つのタイプに分けられます。
1.指を押す->指をドラッグしてリストを移動する->指のドラッグを停止する->指を持ち上げる
2.指を押す->指をすばやくドラッグしてから指を離す->リストはスクロールし続ける->スクロールを停止
上記のプロセスの状態は次のように変化します。
1.静止->ドラッグアンドムーブを強制->ステーショナリー
2.ステーショナリー->ドラッグアンドムーブを強制->単独でロール->ステーショナリー
(2)RecyclerViewのスクロールを監視します
スクロールイベントをリッスンする方法は2つあります。
1.setOnScrollListener(OnScrollListenerリスナー)
2.addOnScrollListener(OnScrollListenerリスナー)
ここで、setOnScrollListenerは、nullポインターの可能性があるため、廃止されています。addOnScrollListenerを使用することをお勧めします。
(3)OnScrollListener
/ **
- OnScrollListenerをRecyclerViewに追加して、スクロールイベント時にメッセージを受信できます
- そのRecyclerViewで発生しました。
-
- @see RecyclerView#addOnScrollListener(OnScrollListener)
- @see RecyclerView#clearOnChildAttachStateChangeListeners()
/
public abstract static class OnScrollListener { /
**
RecyclerViewのスクロール状態が変化したときに呼び出されるコールバックメソッド。
* *
@paramrecyclerViewスクロール状態が変更されたRecyclerView。
*@paramnewState更新されたスクロール状態。{@link #SCROLL_STATE_IDLE}、
*{@link#SCROLL_STATE_DRAGGING}または{@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.
* <p>
* This callback will also be called if visible item range changes after a layout
* calculation. In that case, dx and dy will be 0.
*
* @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){}
}
OnScrollListenerクラスは、次の2つのメソッドを持つ抽象クラスです。
void onScrollStateChanged(RecyclerView recyclerView、int newState):スクロール状態が変化したときのコールバック
void onScrolled(RecyclerView recyclerView、int dx、int dy):スクロール時のコールバック
3.1 onScrollStateChanged(RecyclerView recyclerView、int newState)方法
コールバックの2つの変数の意味:
recyclerView:現在スクロールしているRecyclerView
newState:現在のスクロール状態。
ここで、newStateには3つの値があります。
/ **
- The RecyclerView is not currently scrolling.(静止没有滚动)
*/
public static final int SCROLL_STATE_IDLE = 0;
/ **
- RecyclerViewは現在、ユーザータッチ入力などの外部入力によってドラッグされています。
*(外部によってドラッグされ、通常、ユーザーは指でスクロールしています)
* /
public static final int SCROLL_STATE_DRAGGING = 1;
/ **
- RecyclerViewは現在、外部の制御下にない状態で最終位置までアニメーション化しています。
*(自ω滚PIN)
* /
public static final int SCROLL_STATE_SETTLING = 2;
3.2 onScrolled(RecyclerView recyclerView、int dx、int dy)方法
コールバックの3つの変数の意味:
recyclerView:現在スクロールされているビュー
dx:水平スクロール距離
dy:垂直スクロール距離
dx> 0の場合、指は左にスクロールし、リストはスクロールして右側にコンテンツを表示します
。dx<0の場合、指は右にスクロールします。リストをスクロールして左側にコンテンツを表示すると、
dy> 0の場合、指が上にスクロールし、リストがスクロールして次のコンテンツが表示されます。dy
<0指が下にスクロールすると、リストがスクロールして上記のコンテンツが表示されます
(4)canScrollVerticallyおよびcanScrollHorizontallyメソッド
public boolean canScrollVertically(int direction)
このメソッドは、ビューが垂直方向に上下にスライドできるかどうかを判断するためのものです。
その中で、方向は-1は指が下にスライドする(画面が上にスライドする)ことを意味し、1は指が上にスライドする(画面が下にスライドする)ことを意味します。
public boolean canScrollHorizontally(int direction)
このメソッドは、水平方向のスライドを判断するために使用されます
次に例
を示します。RecyclerView.canScrollVertically(1)の値は下にスクロールできるかどうかを示し、falseは下にスクロールしたことを示し
、RecyclerView.canScrollVertically(-1)の値は上にスクロールできるかどうかを示します。falseは上にスクロールしたこと
(5)下にあるかどうかの2つの判断方法:
5.1方法1:
現在最初に表示されているアイテムの位置+現在表示されているアイテムの数>=アイテムの総数である場合、それ
は一番下にあると判断できます。
LoadingMoreListener = 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);
if (dy > 0) //向下滚动
{
int visibleItemCount = mLinearLayoutManager.getChildCount();
int totalItemCount = mLinearLayoutManager.getItemCount();
int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();
if (!loading && (visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading = true;
loadMoreDate();
}
}
}
};
それがvisibleItemCount+pastVisiblesItems)>=totalItemCountによって
一番下かどうかを判断します。
5.2方法2:
canScrollVerticallyによる判断
LoadingMoreListener = new RecyclerView.OnScrollListener(){ @Override public void onScrollStateChanged (RecyclerView recyclerView、int newState){ super.onScrollStateChanged(recyclerView、newState); if(!loading &&!recyclerView.canScrollVertically(1)){ loading = true; loadMoreDate(); } }
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// if(dy> 0)//向下滚PIN
// { // int visibleItemCount = mLinearLayoutManager.getChildCount(); // int totalItemCount = mLinearLayoutManager.getItemCount(); // int pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition(); // // if(!loading &&(visibleItemCount + pastVisiblesItems)> = totalItemCount){ // load = true; // loadMoreDate(); //} //} } };