2011-12-02 64 views
0

的ListView與來自光標至極我通過在SimpleCursorAdapter的項目填充一個ListView,但每次我打開應用程序,這些項目是重 - 添加到列表視圖不斷增加。當我使用SimpleAdapter,我做這樣的事情:項目正在複製我啓動應用程序與SimpleCursorAdapter

static final ArrayList<HashMap<String, String>> foobar = new 
              ArrayList<HashMap<String,String>>(); 
    SimpleAdapter adapter = new SimpleAdapter(this, foobar, R.layout.list_item, String[] from, int[] to); 
    setListAdapter(adapter); 

做下一個,解決我的問題:

@Override 
    public void onDestroy(){ 
    super.onDestroy(); 
     foobar.removeAll(foobar); 
    } 

但現在,我不想刪除數據庫的內容,所以如何解決它,如果我有一個SimpleCursorAdapter?像這樣的:

> SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, String[] from, int[] to); 

我已經試過setListAdapter(空)cursor.close(),和許多其他人,但沒有效應...

現在,這些hapen當我退出該應用程序使用設備的「後退」按鈕。如果我按下「主頁」按鈕,當我回來時,我擁有相同數量的項目。因此,每次用「返回」按鈕退出時,列表都會重複。

解決感謝Kaediil的答案。評論線是我改進了。孔類:

public class DataBaseActivity extends ListActivity { 

DataBaseMethods dbmet; //is the class that handle database and auxiliar methods working on it 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list); 

    dbmet = new DataBaseMethods(this); 
    Cursor mycursor= dbmet.getItems(); // 1. add new cursor 


    try{ 
      if(!mycursor.moveToFirst()){ //2.check if there are items in the database 
     dbmet.addItems("Daniel","Son","Karate-kid"); 
     dbmet.addItems("Silv", "Stalone", "Terminator"); 
     dbmet.addItems("foo", "bar", "buz"); 
      } // 
      showDatabaseContent(); 
    } 

    finally{ 
     dbmet.close(); 
    } 
} 


public void showDatabaseContent(){ 

    DataBaseMethods dbmet = new DataBaseMethods(this); 
    try{ 

     Cursor cursor = dbmet.getItems(); 
     SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, dbmet.FROM, TO); 
     setListAdapter(myadapter); 
    } 
    finally{ 
     dbmet.close(); 
    } 

} 
+0

你的問題不存在於你提交的代碼中。我猜你的數據是「硬編碼的」,你可能只是簡單地將它保存到數據庫中。看看你的數據庫幫助器類或你在哪裏調用它的方法在onCreate ..如果你找不到它發佈的代碼.. – Joe

回答

2

嗯,這條線是犯罪嫌疑人:

如果它很重要,我填充這個活動的onCreate()的數據庫,但我想也填充它從其他活動,我得到了相同的行爲爲列表視圖。

在填充數據庫調用時是否檢查數據庫是否已經填充?

這聽起來像你只是不斷向光標指向的數據庫添加更多副本。

+0

不,我沒有....看到你的回覆,我試圖用'if cursor.isNull(0)'但每次都產生一個索引異常,無論我放什麼。有什麼建議嗎? – AlexAndro

+0

好吧,看着你編輯的代碼,你肯定會繼續添加到數據庫。你(儘管它有點低效)這樣做:Cursor cursor = dbmet.getItems(); if(!cur.moveToFirst())如果moveToFirst爲空,則返回false。 – Kaediil

+0

它的工作原理:))說實話,我想早點嘗試一下,但我被'cur.isNull(0)'沮喪,我沒有嘗試它,認爲它幾乎是相同的東西。謝謝!我會用一些評論來更新這個問題,即解決方案可見。 – AlexAndro

0
public void showDatabaseContent(){ 

    DataBaseMethods dbmet = new DataBaseMethods(this); 
    try{ 

     Cursor cursor = dbmet.getItems(); 
     SimpleCursorAdapter myadapter = new SimpleCursorAdapter(this, R.layout.item_list, cursor, dbmet.FROM, TO); 
     setListAdapter(myadapter); 
     -->> myadapter.notifyDataSetChanged(); <<---- 
    } 
    finally{ 
     dbmet.close(); 
    } 


} 

您需要調用notifyDataSetChanged()來發信號通知列表,以使其自身僅與新數據一起失效。

NOTE: 如果問題來自Database類。確保每次啓動應用程序時都不要將項目重新插入數據庫中。我可能會混淆你的問題,枯萎的項目是在列表視圖或數據庫中重複。我深信,每次運行應用程序時都會重新插入數據。

+0

Nop,不解決它。我也試圖從這個方法中刪除'dbmet = new DataBaseMethods(this)',認爲它被調用兩次。如果我在每次啓動應用程序時插入,請確保我不想這樣做,但我不知道如何。我插入的唯一位置是'onCreate()',如果我不添加這3個代碼行,我將沒有數據,我測試了它。有什麼建議? – AlexAndro