3

データベースsqliteの行を更新した後、リストビューのアイテムを更新する方法. 私は notifyDataSetChanged() を入れましたが、成功しませんでした。エラーはありませんが、データを更新しません。メニューをクリックして戻ってリストを再度開くと、データが変更されます。したがって、データを更新した後、データを連続して更新したいと思います。以下の構造化コード、ありがとう。

CustomBaseAdapter adapter;
ListView cListView;

onCreateで:

cListView = (ListView) findViewById(R.id.list_category);
List<ItemsArtikel> rowItems = (List<ItemsArtikel>) db.getAllCategory(katname);
adapter = new CustomBaseAdapter(this, rowItems);
cListView.setAdapter(adapter);

リストカテゴリのクエリ:

public List<ItemsArtikel> getAllCategory(String cat) {
    SQLiteDatabase db = this.getWritableDatabase();
    List<ItemsArtikel> cList = new ArrayList<ItemsArtikel>();
    String selectQuery = "SELECT  * FROM " + TABLE_CAT + " WHERE "
            + COLOM_KAT + "=\"" + cat + "\"";
    Cursor c = db.rawQuery(selectQuery, null);
    c.moveToFirst();
    if (c.getCount() > 0) {
        do {
            ItemsArtikel kat = new ItemsArtikel();
            kat.setID(c.getLong(c.getColumnIndex(COLOM_ID)));
            kat.setName(c.getString(c.getColumnIndex(COLOM_NAME)));
            kat.setLink(c.getString(c.getColumnIndex(COLOM_LINK)));
            kat.setImage(c.getString(c.getColumnIndex(COLOM_IMAGE)));
            kategoriList.add(kat);
        } while (c.moveToNext());
    }
    return cList;
}

リストビューに使用した後、for画像をダウンロードし、画像をダウンロードするときに AsyncTask を使用してデータベースの各行を更新します。画像のダウンロードが成功し、行も更新されました。リストビューで更新しないでください。

これは、イメージをダウンロードするときのコード onPostExecute です。

@Override
protected void onPostExecute(HashMap<String, Object> result) {
    String id = (String) result.get("id");
    String path = (String) result.get("image");

    // update row in database
    db.updateRowCategory(id, path);

    cListView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}
4

2 に答える 2

2

notifyDataSetChanged()を呼び出すと、変更を反映するようにコンテンツを更新するようにレジスタビューに通知するだけです。

あなたの場合、アダプタデータモデルではなくデータベースのデータを更新しています。変更を反映するには、データモデルListViewを更新してから、Adapter'snotifyDataSetChanged()を呼び出す必要があります。

また

データベースから直接データをレンダリングする場合は、CursorAdapteronContentChanged ()を使用して、 ListViewの更新を実装します。

于 2013-02-14T03:43:42.660 に答える
0

アダプタを追加する前に、次の行を使用してください。

@Override
protected void onPostExecute(HashMap<String, Object> result) {
    String id = (String) result.get("id");
    String path = (String) result.get("image");

    // update row in database
    db.updateRowCategory(id, path);
    cListView.Invalidate();
    cListView.setAdapter(adapter);
    cListView.Invalidate();
    adapter.notifyDataSetChanged();
}
于 2013-02-14T05:46:57.980 に答える