いまさらだが、、、
スクロールで最後尾に達したら次を読むリストビューを考えていて書いてみた。
かなり省略してはいるが、以下のようになった。cancelled とか考慮しなくてはならない。。。
publishProgress でリスト追加して、notifyDataSetChanged は、重くなる
変なやり方なのだろうか。。。
ItemreadTask task;
ListView mListview;
View mFooterView;
mListview = (ListView)findViewById(R.id.listView);
// フッタは Adapter セットの前で!
mFooterView = getLayoutInflater().inflate(R.layout.listfooter, null);
:
Adapter セット省略
:
mListview.setOnScrollListener(new AbsListView.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){
// 最後尾に到達
if (実行中でなければ!){
task = new ItemreadTask(mDisplayedCount);
task.execute();
}
}
}
});
-------
class ItemreadTask extends AsyncTask<Void,Item,Integer>{
private int mCount;
@Override
protected void onPreExecute(){
mListview.addFooterView(mFooterView);
}
@Override
protected Integer doInBackground(Void...params){
// cancelled で中断するようにする。
// publishProgress でリスト表示
publishProgress(item);
// カウンタを返す
return mCount;
}
@Override
protected void onPostExecute(Integer result){
mListview.removeFooterView(mFooterView);
}
@Override
protected void onCancelled(){
// cancelled で中断するようにする。
}
@Override
protected void onProgressUpdate(Item...values){
mList.add(values[0]);
*1.getWrappedAdapter()).notifyDataSetChanged();
}
}
*1:BaseAdapter)((HeaderViewListAdapter)mListview.getAdapter(