OnScrollListenerのscrollState
OnScrollListenerのscrollStateの挙動を確認しました。
ドキュメントを読むとscrollStateは0,1しかとら無いようにも読めますが、2もありました。 http://developer.android.com/intl/ja/reference/android/widget/AbsListView.OnScrollListener.html
stateの内容
|:--:|:--:| |state|意味| |1|スクロールを開始した時| |2|フリックして指が離れた時| |0|スクロール処理が止まった時|
stateの遷移
リストから指を離さ無いでスクロールする場合
1 --> 0
フリックしてスクロールをする場合
1 --> 2 --> 0
フリックしてスクロールを連続した場合
1 --> 2 --> 0
の場合と
1 --> 2 --> 0 --> 1 --> 2 --> 0
の場合があるようです。二回目以降のフリックを画面に軽くタッチした場合は前者になると思います。
onScrollメソッドとの関係は、
onScrollStateChangedでscrollState=1-> onScroll -> onScrollStateChangedでscrollState=0
となるようです。
package com.example.test14; import android.app.Activity; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.row, createData()); ListView listView = (ListView)findViewById(R.id.listView); listView.setAdapter(adapter); listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { Log.d("xxx", String.format( // "onScrollStateChanged scrollState=%d firstVisiblePos=%d", // scrollState, // view.getFirstVisiblePosition())); } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { Log.d("xxx", String.format("onScroll firstVisibleItem=%d", firstVisibleItem)); } }); } private List<String> createData() { List<String> ret = new ArrayList<>(); for (int i = 0; i < 150; i++) { ret.add(String.format("[%d] %s", i, getRandomString(15))); } return ret; } private static String getRandomString(int maxlength) { //http://stackoverflow.com/a/25447172 String result = ""; int i = 0; int min = 33; int max = 122; while (i < maxlength) { int n = (int) (Math.random() * (max - min) + min); if (n >= 33 && n < 123) { result += (char) n; ++i; } } return result; } }