アプリによっては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()メソッドを投げるなんて思いも付かず、ずいぶん悩んだものだ。