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's,然后调用 notifyDataSetChanged();

或者

如果您直接从数据库渲染数据,请使用CursorAdapter并实现onContentChanged ()更新 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 回答