我有一个dialogfragment,它将一个项添加到数据库并立即在listview中显示它。
添加的项目立即显示在列表视图中,但我不知道为什么数据库中的最后一项不会出现。 它在执行再次显示listview的活动后出现,但不是在通过我的对话框片段添加项目之后。
例如,如果我在列表视图和数据库中有3个项目“a”,“b”和“d”,并且当我添加“c”时,“d”不会显示在列表视图中。它只会在执行再次显示listview的片段后显示。
答案 0 :(得分:0)
您的适配器使用两个不同的列表,第一个是填充为object
的超类列表:
super(activity, R.layout.laundry_list_item, objects);
另一个是你自己的:
private List my;
当您向my
添加项目时,为您的ListView提供数据的超类在重新启动活动之前不知道此更改。
尝试更改您的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();
希望其中一个有帮助!