我有一个 dialogfragment 将一个项目添加到数据库并立即在 listview 中显示它。
添加的项目立即显示在列表视图中,但我不知道为什么数据库中的最后一个项目没有出现。它在执行显示 listview 的活动之后出现,但不仅仅是在通过我的对话框片段添加项目之后。
例如,如果我的列表视图和数据库中有 3 个项目“a”、“b”和“d”,当我添加“c”时,“d”不会显示在列表视图中。它仅在再次执行显示列表视图的片段后显示。
您的适配器正在使用两个不同的列表,第一个是超类的列表,填充为object
:
super(activity, R.layout.laundry_list_item, objects);
另一个是你自己的:
private List my;
当您将项目添加到my
为您的 ListView 提供数据的超类时,直到您重新启动 Activity 才知道此更改。
尝试将您的Save
按钮更改为:
nam = name.getText().toString();
pri = price.getText().toString();
i = new MyItem(nam, Double.parseDouble(pri));
db.addMyItem(i);
MyActivity f = (MyActivity) getActivity().getFragmentManager().findFragmentByTag("my");
f.getMyListAdapter().add(i);
// You might need this, but I believe the adapter will update itself in add()
//f.getMyListAdapter().notifyDataSetChanged();
getDialog().dismiss();
这将使用超类的列表并避免您的问题。
或者,使用您发布的代码,我相信SimpleCursorAdapter是比您自己的适配器更好的选择。
在你的片段中:
public void onCreate() {
...
// Retrieve a Cursor of every row in the database, "SELECT _id, name, quantity FROM Table"
mCursor = db.getAllMyItemsCursor();
madapter = new SimpleCursorAdapter(this, R.layout.laundry_list_item, cursor,
new String[] { "name", "quantity" },
new int[] { R.id.item_name, R.id.item_qty });
}
public void updateListView() {
mCursor.requery();
madapter.notifyDataSetChanged();
}
在Save
按钮中:
nam = name.getText().toString();
pri = price.getText().toString();
db.addMyItem(new MyItem(nam, Double.parseDouble(pri)));
MyActivity f = (MyActivity) getActivity().getFragmentManager().findFragmentByTag("my");
f.updateListView();
希望其中之一有帮助!