[Android]ListViewの内容を変更して再描画する方法

投稿者:

アプリによってはListViewの内容を変更して再描画したい時がある。
その方法を簡単に記しておく。

ListView内のデータを管理しているのはAdapterなので、ListViewのインスタンスからgetAdapter()メソッドでAdapterを取得し、さらに変更したい行のリストアイテムをgetItem()で取得する。さらにアイテムの内容を変更したら、リストが書き換わる・・・と思いきや、そうは問屋が卸さない。notifyDataSetChanged()メソッドでAdapterにデータの内容が変更になったことを通知して初めて再描画される。

下の例はボタンをクリックするとリストの文字が”MAZDA”から”Nissan”に変わるプログラムの一部である。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ListView listView = (ListView) findViewById(R.id.sample_list);

    CarMaker[] caramakers = {
            new CarMaker(1, "TOYOTA"),
            new CarMaker(2, "MAZDA"),
            new CarMaker(3, "HONDA")
    };

    CarMakerAdapter adapter = new CarMakerAdapter(this, 0, caramakers);
    listView.setAdapter(adapter);

    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
        //ボタンクリック時のイベント
        @Override
        public void onClick(View view) {
            CarMakerAdapter adapter = (CarMakerAdapter) listView.getAdapter();  //リストのAdapter取得
            CarMaker item = adapter.getItem(1); //二番目のリストアイテムを取得(index = 1)
            item.setName("Nissan");            //名前を"Nissan"に変更
            adapter.notifyDataSetChanged();     //Adapterに変更を通知
        }
    });
}

実行結果

ボタンをクリックすると

二番目の行が”MAZDA”から”Nissan”にかわる

知ってしまえば単純なことだが、最初のころはnotifyDataSetChanged()メソッドを投げるなんて思いも付かず、ずいぶん悩んだものだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください