2013-01-16 72 views
0

我目前的應用程序從一個SQLite數據庫拉和顯示數據列表視圖。數據庫第一列中的數據顯示在列表視圖中,點擊後,活動開始顯示與第一列關聯的列的其餘部分。數據編輯完成後,數據庫會更新,但列表視圖不顯示更新,除非應用程序重新啓動。我試圖在我的onResume方法中實現startActivityForResult(),但是不成功。我試圖在數據庫更新後刷新我的列表視圖。我怎樣才能做到這一點。Android的ListView的源碼更新刷新

ListView的活動:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login_listview); 


    loginList = (ListView) 
    findViewById(R.id.loginlist); 
    loginList.setOnItemClickListener(this); 

    webLogin = (Button) 
    findViewById(R.id.button3); 
    webLogin.setOnClickListener(this); 

    loginArrayList = new ArrayList<LoginDetails>(); 

    loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); 
    loginList.setAdapter(loginListAdapter); 
} 

@Override 
public void onClick (View v) { 
    Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); 
    startActivity(webLoginIntent); 
} 

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(); 

    Intent i = new Intent(LoginList.this, UpdateDeleteLoginList.class); 
    LoginList.this.startActivityForResult(i, 1);  
    loginList.setAdapter(loginListAdapter); 

loginListAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, populateList()); 
loginList.setAdapter(loginListAdapter); 

} 

更新活動:

 @Override 
public void onClick(View v){ 

    loginSitetext = sName.getText().toString(); 
    loginAddresstext = wUrl.getText().toString(); 
    loginUsertext = uName.getText().toString(); 
    loginpassWordtext = pWord.getText().toString(); 
    loginNotestext = lNotes.getText().toString(); 

    LoginDetails loginDetails = new LoginDetails(); 

    loginDetails.setsName(bundledWebSite); 
    loginDetails.setwUrl(bundledWebAddress); 
    loginDetails.setuName(bundledUserName); 
    loginDetails.setpWord(bundledPassWord); 
    loginDetails.setlNotes(bundledNotes); 

    if(v.getId()==R.id.rucBttn){ 
     finish(); 

    }else if(v.getId()==R.id.ruuBttn){ 
     updateLoginDetails(loginDetails); 

     Intent returnIntent = new Intent(); 
     setResult(RESULT_CANCELED, returnIntent); 
     finish(); 

    }else if(v.getId()==R.id.rudBttn){ 
     deleteLoginDetails(loginDetails); 
    } 

} 


private void updateLoginDetails(LoginDetails loginDetails){ 

    dataStore androidOpenDbHelper = new dataStore(this); 

    SQLiteDatabase sqliteDatabase = androidOpenDbHelper.getWritableDatabase(); 

    ContentValues contentValues = new ContentValues(); 

    contentValues.put(dataStore.COLUMN_NAME_SITE, loginSitetext); 
    contentValues.put(dataStore.COLUMN_NAME_ADDRESS, loginAddresstext); 
    contentValues.put(dataStore.COLUMN_NAME_USERNAME, loginUsertext); 
    contentValues.put(dataStore.COLUMN_NAME_PASSWORD, loginpassWordtext); 
    contentValues.put(dataStore.COLUMN_NAME_NOTES, loginNotestext); 

    String[] whereClauseArgument = new String[1]; 
    whereClauseArgument[0] = loginDetails.getsName(); 

    System.out.println("whereClauseArgument[0] is :" + whereClauseArgument[0]); 

    sqliteDatabase.update(dataStore.TABLE_NAME_INFOTABLE, contentValues, dataStore.COLUMN_NAME_SITE+"=?", whereClauseArgument); 

    sqliteDatabase.close(); 
    finish(); 

回答

1

可以通過調用notifyDataSetUpdated適配器上刷新列表視圖。這迫使整個listview刷新,getView將在所有刷新它的視圖上被調用。

0

你問這個問題有一個標準溶液,這是(不幸)不是的幾行代碼就更加複雜。它是由內容提供商數據Loader光標適配器的組合來實現。

我已經把一個小演示的GitHub有包括所有成分的骨架,並且可以進行修改,以達到你所需要的。它還處理平板電腦上的單窗格/雙窗格佈局(以及更新的電話)。

Content provider是作爲數據庫表的接口並通知您的ListView有關更改的模塊,因此需要立即刷新列表。只需grep'getContentResolver()。notifyChange()'調用,這些照顧刷新您的列表。只要您使用Content Provider來訪問您的數據(CRUD - 查詢,插入,刪除,更新...),您的所有操作將立即反映在ListView中。

有很多關於這方面的信息,由Wolfram Rittmeyer,Lars Vogel, Alex Lockwood,...如果你想得到有關這個問題的教育。

好運