2011年3月6日日曜日

ListViewのスクロール位置のあれこれ


AndroidMarketアプリやYouTubeアプリ、Gmailアプリなどでは
ListViewを最後までスクロールすると自動的に次の数件を取得し表示される。

android.widget.AbsListView.OnScrollListener#onScrollを利用すると
表示されている先頭のインデックス(firstVisibleItem)、
表示されているリストの数(visibleItemCount)、リストのトータル数(totalItemCount)
が引数として渡ってくるので、firstVisibleItem + visibleItemCount = totalItemCount
になる時、最後までスクロールされたと判定出来る。


上図で赤枠部分が画面に表示されている部分になる。
最後までスクロールしている右図でfirstVisibleItem + visibleItemCount = totalItemCount
になっていることがわかる。

下記がソースの一部。
ListView listView = (ListView) findViewById(android.R.id.list);
listView.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // 最後までスクロールされたかどうかの判定
        if (totalItemCount == firstVisibleItem + visibleItemCount) {
            // ここに次の数件を取得して表示する処理を書けばいい
        }
    }
});

リストの追加などでListViewを更新する際、スクロール位置が毎回戻ってしまっては
ユーザービリティの悪いものになってしまう。
ListViewのスクロール位置の取得と設定は下記のようにして実現出来る。

取得
int position = listView.getFirstVisiblePosition();
int y = listView.getChildAt(0).getTop();

設定
listView.setSelectionFromTop(position, y);

インターネット上からデータを取得する際に使用する頻度が多いかも。

0 件のコメント:

コメントを投稿