删除操作后更新ListView

时间:2013-01-14 22:59:34

标签: android sqlite android-listview

我正在显示从Android OS sqlite数据库中提取的数据。当我点击它们时,我成功地获取了要删除的项目。但是,我在操作后刷新或更新列表视图时出现问题。

以下是删除联系人的代码。

deleteBtn = (Button)v.findViewById(R.id.deleteBtn);
    deleteBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), "Deleted: " + c.getId() + " " + c.getName(), Toast.LENGTH_SHORT).show();
            adapter.deleteContact(c.getId());
            updateList();
        }
    });

下面是updateList()方法:

public void updateList(){
    myList.refreshDrawableState();
    myList.invalidateViews();
    this.notifyDataSetChanged();
}

我在这个方法中包含了我试图刷新的所有三种方式,但没有一种方法适合我。知道如何实现这一目标吗?

编辑:我改变了我的代码,认为这将是解决方案,但它也不起作用:

DbAdapter类删除方法():

public boolean deleteContact(int rowId){
    getAllContactsList();
    return db.delete(DB_TABLE, COLUMN_ID + "=" + rowId, null) > 0;

}

getAllContactsList():

public List<Contact> getAllContactsList(){
    List<Contact> contactList = new ArrayList();

    Cursor c = db.query(DB_TABLE, new String [] {COLUMN_ID, COLUMN_FNAME, COLUMN_LNAME}, null, null, null, null, null);

    //loop through cursor rows and add to list
    if(c.moveToFirst()){
        do{
            Contact contact = new Contact();
            contact.setId(Integer.parseInt(c.getString(0)));
            contact.setfName(c.getString(1));
            contact.setlName(c.getString(2));
            contactList.add(contact);
        }while(c.moveToNext());
    }
    return contactList;
}public List<Contact> getAllContactsList(){
    List<Contact> contactList = new ArrayList();

    Cursor c = db.query(DB_TABLE, new String [] {COLUMN_ID, COLUMN_FNAME, COLUMN_LNAME}, null, null, null, null, null);

    //loop through cursor rows and add to list
    if(c.moveToFirst()){
        do{
            Contact contact = new Contact();
            contact.setId(Integer.parseInt(c.getString(0)));
            contact.setfName(c.getString(1));
            contact.setlName(c.getString(2));
            contactList.add(contact);
        }while(c.moveToNext());
    }
    return contactList;
}

我想通过在删除联系人之前获取新游标它会相应地更新列表。不幸的是没有区别。有任何想法吗 ?

3 个答案:

答案 0 :(得分:0)

您必须通知列表的适配器您已修改基础数据。

尝试使用adapter.notifyDataSetChanged();

答案 1 :(得分:0)

您必须重新查询并生成新列表:

public void updateList(){
    clear();
    addAll(contactsDbHelper.getAllContactsList()); //addAll works since 11 API version.
    notifyDataSetChanged(); //need this is you dissabled auto notify
}

P.S。您应该使用Content providersCursorAdapter来完成此项工作,但是您需要手动通知内容提供商有关更改的内容,因为自{11}版本以来已弃用Cursor.requery()

答案 2 :(得分:0)

您似乎拥有Database Adapter类,但是您缺少ArrayAdapter类,该类用于管理ListView中显示的项目列表。请查看this example,特别是WeatherAdapter.java类。

如果我的假设出错并且代码中的adapter对象不是数据库适配器,而是ArrayAdapter类,请尝试使用adapter.notifyDataSetChanged()而不是this.notifyDataSetChanged()。

如果这有帮助,请告诉我。