0

データベースにアイテムを追加し、すぐに listview に表示するダイアログフラグメントがあります。

追加されたアイテムはすぐにリストビューに表示されますが、データベースの最後のアイテムが表示されない理由がわかりません。リストビューを表示するアクティビティを再度実行した後に表示されますが、ダイアログフラグメントを介して項目を追加した直後ではありません。

たとえば、リストビューとデータベースに「a」、「b」、「d」の 3 つの項目があり、「c」を追加すると、「d」はリストビューに表示されません。リストビューを表示するフラグメントを再度実行した後にのみ表示されます。

4

1 に答える 1

0

アダプタは2つの異なるリストを使用しています。最初のリストは、次のように入力されたスーパークラスのリストobjectです。

super(activity, R.layout.laundry_list_item, objects);

もう1つはあなた自身のものです:

private List my;

ListViewのデータを提供するスーパークラスにアイテムを追加するとmy、アクティビティを再起動するまでこの変更を認識しません。

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 に答える