2013-01-08 126 views
1

我目前無法從我的ListView中查看新插入的sqlite數據,而無需重新啓動我的整個應用程序。目前,當選擇ListView項目時,新的活動開始顯示詳細信息。一旦詳細信息被更新,編輯或項目被刪除,ListView將再次顯示,但包含所有原始數據,除非應用程序關閉並重新啓動。列表視圖OnResume方法如下。如何在屏幕上顯示ListView時刷新ListView。我嘗試添加.notifyDataSetChanged失敗。不知道我是否正確實施。如何使Android ListView刷新

public List<String> populateList(){ 

List<String> webNameList = new ArrayList<String>(); 

dataStore openHelperClass = new dataStore (this); 

SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase(); 

Cursor cursor = sqliteDatabase.query(dataStore.TABLE_NAME_INFOTABLE, null, null, null, null, null, dataStore.COLUMN_NAME_SITE, null); 

startManagingCursor(cursor); 

while (cursor.moveToNext()){ 

String sName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_SITE)); 
String wUrl = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_ADDRESS)); 
String uName = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_USERNAME)); 
String pWord = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_PASSWORD)); 
String lNotes = cursor.getString(cursor.getColumnIndex(dataStore.COLUMN_NAME_NOTES)); 

LoginDetails lpDetails = new LoginDetails(); 

    lpDetails.setsName(sName); 
    lpDetails.setwUrl(wUrl); 
    lpDetails.setuName(uName); 
    lpDetails.setpWord(pWord); 
    lpDetails.setlNotes(lNotes); 

    loginArrayList.add(lpDetails); 
    webNameList.add(sName); 
} 

    sqliteDatabase.close(); 
    return webNameList; 
} 



    @Override 
    protected void onResume() { 
    super.onResume(); 
    loginListAdapter = new ArrayAdapter<String>(this,  android.R.layout.simple_list_item_1, populateList()); 
    loginList.setAdapter(loginListAdapter); 
} 

    @Override 
    public void onItemClick(AdapterView<?> arg0 , View arg1, int arg2, long arg3) { 
    Toast.makeText(getApplicationContext(), "Selected ID :" + arg2,  Toast.LENGTH_SHORT).show(); 

Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); 

LoginDetails clickedObject = loginArrayList.get(arg2); 

    Bundle loginBundle = new Bundle(); 
loginBundle.putString("clickedWebSite",clickedObject.getsName()); 
loginBundle.putString("clickedWebAddress",clickedObject.getwUrl()); 
loginBundle.putString("clickedUserName",clickedObject.getuName()); 
loginBundle.putString("clickedPassWord",clickedObject.getpWord()); 
loginBundle.putString("clickedNotes",clickedObject.getlNotes()); 

updateDeleteLoginInfo.putExtras(loginBundle); 

startActivity(updateDeleteLoginInfo); 
+0

是什麼'dataStore.COLUMN_NAME_SITE'在你的代碼?你如何添加/ /更新/刪除項目?我認爲你的問題是因爲你同時使用getReadableDatabase和getWriteableDatabase方法。 – vorrtex

+0

請首先將您的數據庫相關代碼放在與活動類別不同的​​課程中 –

回答

0

您正在使用startActivity。爲什麼不使用startActivityForResult呢? this question的答案詳細說明了您將如何稱爲第二個活動。一旦它返回,你將不得不使用notifyDataSetChanged()調用。

+0

與活動無關。很明顯,主要問題是數據的同步。 – vorrtex

+0

嗯,我看到他用startActivity調用來調用updateDeleteLoginInfo。從那以後,我假設這是他用來更新/刪除信息的活動的名稱,並且由於他沒有阻止當前活動,所以對列表的任何更改都不會反映出來。我有類似的代碼,有類似的問題,這就是爲什麼我回答他。 – DigCamara

+0

@DigCamera他使用startActivity方法就夠了。如果要將數據存儲在可供所有活動訪問的全局對象中,它的工作方式與startActivityForResult相同。 SQLite數據庫就是這種對象的一個​​很好的例子,儘管它比一些內存中的ArrayList更難使用。 – vorrtex

0

你只顯示應用程序代碼的一部分,所以我在這裏可以offbase,但它似乎您使用遊標返回一個列表並使用該列表創建一個ArrayAdapter ...

如果您希望數據是'新鮮'的,爲什麼不用LoaderManager使用CursorLoader? LoaderManager有幾個好處(例如將查詢從UI線程移出),並且LoaderManager在監控數據庫更改時爲您做了一些繁重的工作。

還有我發現非常有幫助的一篇博客文章 - http://www.androiddesignpatterns.com/2012/07/understanding-loadermanager.html