我正在显示从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;
}
我想通过在删除联系人之前获取新游标它会相应地更新列表。不幸的是没有区别。有任何想法吗 ?
答案 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 providers和CursorAdapter来完成此项工作,但是您需要手动通知内容提供商有关更改的内容,因为自{11}版本以来已弃用Cursor.requery()
。
答案 2 :(得分:0)
您似乎拥有Database Adapter类,但是您缺少ArrayAdapter类,该类用于管理ListView中显示的项目列表。请查看this example,特别是WeatherAdapter.java类。
如果我的假设出错并且代码中的adapter
对象不是数据库适配器,而是ArrayAdapter类,请尝试使用adapter.notifyDataSetChanged()
而不是this.notifyDataSetChanged()。
如果这有帮助,请告诉我。