2011年3月6日日曜日

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


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

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


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

下記がソースの一部。
  1. ListView listView = (ListView) findViewById(android.R.id.list);  
  2. listView.setOnScrollListener(new OnScrollListener() {  
  3.   
  4.     @Override  
  5.     public void onScrollStateChanged(AbsListView view, int scrollState) {  
  6.     }  
  7.   
  8.     @Override  
  9.     public void onScroll(AbsListView view, int firstVisibleItem,  
  10.             int visibleItemCount, int totalItemCount) {  
  11.         // 最後までスクロールされたかどうかの判定  
  12.         if (totalItemCount == firstVisibleItem + visibleItemCount) {  
  13.             // ここに次の数件を取得して表示する処理を書けばいい  
  14.         }  
  15.     }  
  16. });  

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

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

設定
  1. listView.setSelectionFromTop(position, y);  

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

0 件のコメント:

コメントを投稿