0

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

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

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

4

1 回答 1

0

您的适配器正在使用两个不同的列表,第一个是超类的列表,填充为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();

希望其中之一有帮助!

于 2012-07-18T18:16:46.057 回答