2010年08月16日

ListView への項目追加

どこかで以下のようなコードを見かけました。
public class TestActivity extends ListActivity {
    private ArrayList items;
    ArrayAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        items = new ArrayList();
        items.add("東京都");
        items.add("神奈川県");
        items.add("千葉県");
        items.add("埼玉県");

        adapter = new ArrayAdapter(this, R.layout.row, items);
        setListAdapter(adapter);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      menu.add("追加");
      return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	items.add("福岡県");
    	adapter.notifyDataSetChanged();
    	return true;
    }
}
  1. 表示させる項目の容れ物として、ArrayList を作成
  2. ArrayList に項目追加
  3. ArrayList を初期データとして、ArrayAdapter を生成
  4. setListAdapter() で ArrayAdapter を登録
という流れです。
このような実装をしてしまった場合、項目を追加するたびに、
    	items.add("福岡県");
    	adapter.notifyDataSetChanged();
という風に ArrayAdapter::notifyDataSetChanged() を呼ぶ羽目になります。
具体的には、以下。
public class TestActivity extends ListActivity {
    ArrayAdapter adapter;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        adapter = new ArrayAdapter(this, R.layout.row);
        adapter.add("東京都");
        adapter.add("神奈川県");
        adapter.add("千葉県");
        adapter.add("埼玉県");

        setListAdapter(adapter);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      menu.add("追加");
      return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	adapter.add("福岡県");
    	return true;
    }
}
さっきのものとの違いを明記しながら解説すると、
  1. 表示させる項目の容れ物として、ArrayList を作成
  2. ArrayList に項目追加
  3. ArrayList を初期データとして、ArrayAdapter を生成
  4. ArrayAdapter に直接データを登録
  5. setListAdapter() で ArrayAdapter を登録
こうすると、項目の追加は adapter.add("hoge") のみで完了します。

当然これにはからくりがあって、ArrayAdapter のソースを見ると、
    public void add(T object) {
        if (mOriginalValues != null) {
            synchronized (mLock) {
                mOriginalValues.add(object);
                if (mNotifyOnChange) notifyDataSetChanged();
            }
        } else {
            mObjects.add(object);
            if (mNotifyOnChange) notifyDataSetChanged();
        }
    }
という風になっています。 初期値として ArrayList を与えても、adapter.add("hoge") としてやると、ArrayList 自体も更新してくれているのがわかります。
ラベル:ListView android
posted by おちエン at 21:56| Comment(0) | Android | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。