読者です 読者をやめる 読者になる 読者になる

publishProgress でリスト要素追加

ListView AsyncTask publishProgress で更新する方法、
いまさらだが、、、
スクロールで最後尾に達したら次を読むリストビューを考えていて書いてみた。

かなり省略してはいるが、以下のようになった。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(