IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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 の場合があるようです。二回目以降のフリックを画面に軽くタッチした場合は前者になると思います。

onScrollStateChangedでscrollState=1-> onScroll -> onScrollStateChangedでscrollState=0 となるようです。

  • 確認コード
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
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 < 200; 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;
    }

}