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()を使った方が良さそうですね。