添加项目后,数据库中的最后一项未出现在列表视图中

时间:2012-07-18 16:00:38

标签: android database

我有一个dialogfragment,它将一个项添加到数据库并立即在listview中显示它。

添加的项目立即显示在列表视图中,但我不知道为什么数据库中的最后一项不会出现。 它在执行再次显示listview的活动后出现,但不是在通过我的对话框片段添加项目之后。

例如,如果我在列表视图和数据库中有3个项目“a”,“b”和“d”,并且当我添加“c”时,“d”不会显示在列表视图中。它只会在执行再次显示listview的片段后显示。

1 个答案:

答案 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();

希望其中一个有帮助!