ListViewの更新を促すとき
Androidの会MLに質問投げました。
ListViewの内容が更新されないという質問です。
ListViewでEmptyメッセージが表示されている状態から、アイテムを追加しても表示されない。 - 日本Androidの会 | Google グループ http://groups.google.co.jp/group/android-group-japan/browse_thread/thread/351885804d5f7b66
質問の内容はこちら
ListViewの要素がない状態から、要素を追加してもemptyメッセージが表示されたままで、ListViewが表示されません。 あらかじめListViewに要素が1つでもある場合なら、追加されます。 invalidateやinvalidateViewsをためしたんですが、どちらもダメでした。 他に更新を促す方法があるんでしょうか
テストコードはこちら
MainActivity.java
public class MainActivity extends ListActivity { private ArrayList<String> items; private ListView list; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); list = (ListView) findViewById(android.R.id.list); items = new ArrayList<String>(); // items.add("item0"); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, items)); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("add item"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { items.add("item"); list.invalidateViews(); return true; } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@android:id/empty" android:text="not found" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
このコードを実行すると、emptyのメッセージが表示されたままでリストの要素は増えてくれません。
MLに投げたんですが、twitterで@gen_suke さんに教えていただきました。
Adapter#notifyDataSetChanged()を使えば更新される事が分かりました。
MainActivity.java
public class MainActivity extends ListActivity { private ArrayList<String> items; private ListView list; private ArrayAdapter<String> adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); list = (ListView) findViewById(android.R.id.list); items = new ArrayList<String>(); // items.add("item0"); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, items); setListAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("add item"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { items.add("item"); // list.invalidateViews(); adapter.notifyDataSetChanged(); return true; } }
このコードを使えば更新されます。
ListViewを更新するときは
ListView#invalidateView()よりも
Adapter#notifyDataSetChanged()を使った方が良さそうですね。