ボタンクリックによってListViewのデータを変更させたい場合、
アダプタに渡したデータを更新したすぐあとに、
notifyDataSetChanged()を呼ぶのを忘れないように。
以下サンプル
ListACtivitySamle.java
public class ListACtivitySamle extends ListActivity {
/** アダプタ */
SampleAdapter adapter;
/** アダプタへ渡すリスト */
List<User> users;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
users = makeUsers();//ユーザー情報取得
adapter = new SampleAdapter(this, users);
setListAdapter(adapter);
}
public void addClickMethod(View v ) {
User user = new User();
user.name = "太郎";
user.mail = "taro@taro.com";
user.phone = "090-1111-2222";
adapter.addList(user);
//アダプタに対してデータが変更したことを知らせる
adapter.notifyDataSetChanged();
}
・・・・・
}
ユーザー情報にデータを追加したあと、
notifyDataSetChanged()を呼び出している。
SampleAdapter.java
public class SampleAdapter extends BaseAdapter {
private Context ctx;
private List<User> users;
public SampleAdapter(Context cotext, List<User> users) {
this.ctx = cotext;
this.users = users;
}
・・・・
public void addList(User user) {
users.add(user);
}
・・・・・・
}
アダプタクラスは特筆すべき点はなし。
2012年11月4日日曜日
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のメッセージが表示されたままでリストの要素は増えてくれません。
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()を使った方が良さそうですね。
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のメッセージが表示されたままでリストの要素は増えてくれません。
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()を使った方が良さそうですね。
登録:
投稿 (Atom)