2013-01-14 57 views
4

我正在顯示從Android OS sqlite數據庫中提取的數據。當我點擊它們時,我正在成功獲取要刪除的項目。但是,我有一個問題刷新,或在操作後更新列表視圖。刪除操作後更新ListView

下面是我刪除聯繫人的代碼。

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

您必須通知列表的適配器您已修改了基礎數據。

使用adapter.notifyDataSetChanged();

+0

我正在用'this.notifyDataSetChanged()'來做這件事,但是出於某種原因它沒有對列表做任何改變! – Javacadabra

0

你必須重新查詢,並和產生新的列表,請嘗試:

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

附:您應該使用Content providersCursorAdapter完成此項工作,但您需要手動通知內容提供商有關更改,因爲Cursor.requery()自11版以來已棄用。

0

看起來您擁有數據庫適配器類,但您缺少ArrayAdapter類,該類用於管理列表視圖中顯示的項目列表。看看this example,特別是WeatherAdapter.java類。

如果我錯了,在我的假設和adapter對象在你的代碼是不是數據庫適配器,而是一個ArrayAdapter類,可以嘗試在adapter.notifyDataSetChanged()代替this.notifyDataSetChanged()。

讓我知道這是否有幫助。

+0

updatelist()方法是一個擴展ArrayAdapter 的類的方法。 – Javacadabra