2014-02-27 122 views
0

我知道有關於這個問題的帖子很多,我想我已經閱讀它們,但沒有幫助我......列表視圖不更新插入

我有一個活動的一個ListView它填充了一個遊標從一個數據庫,這一切工作正常。

然後我在屏幕上有一個按鈕,開始一個新的活動,用戶可以在列表中添加一個新的條目。

完成此操作後,將重新顯示第一個活動,但最近添加的條目不在列表中。如果我停下並重新啓動應用程序,則新條目將正確顯示。

我試過了幾個變化 - 沒有產生任何錯誤。

這是我的主要代碼:

public class FirstScreenActivity extends ListActivity { 

public static String TAG = "My App:"; 

//This is the Adapter being used to display the list's data 
public SimpleCursorAdapter vehAdapter; 

    static final String[] PROJECTION = new String[] {dbMain.ENTRY_ID, dbMain.VEHICLE_NAME}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Create/prepare database 
    mpgDBHelper mpgDBhelp = new mpgDBHelper(this.getBaseContext()); 
    SQLiteDatabase mpgDB = mpgDBhelp.getWritableDatabase(); 

    //Display vehicles available - first get any entries 

    Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 

    // build a listView 
    String[] fromColumns = {dbMain.VEHICLE_NAME}; 
    int[] toViews = {android.R.id.text1}; 

    vehAdapter = new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_1, mpgCur, fromColumns, toViews, 0); 
    setListAdapter(vehAdapter); 
    setContentView(R.layout.activity_first_screen); 
} 

public void createNewVeh(View view) { 
    // create intent to start another activity 
    Intent newVehIntent = new Intent(this, createNewVehicleActivity.class); 

    startActivity(newVehIntent); 

    // I have tried putting the update lines here but also did not work 
} 

@Override 
public void onResume() { 

    super.onResume(); 

     Log.v(TAG, "In onResume...about to reset list"); 

    // Refresh ListAdaptor 
     //vehAdapter.getCursor(); <-- this doesn't work either 
    vehAdapter.notifyDataSetChanged(); 

} 

在對其他活動的代碼,我只是用:

finish(); 

...數據庫後插入。

我從onResume獲取日誌消息 - 有什麼建議嗎?

+2

我認爲最好在startActivityForResult中更新onActivityResult方法而不是onResume()中的適配器。你試過了嗎? – Micer

+0

我沒有 - 爲什麼更好? – Nelmo

+1

方法'onResume()'也被稱爲鎖定和解鎖手機之後,這種情況下,當你不需要更新數據庫中的數據時,因爲它們可能沒有改變。 – Micer

回答

3

改變的數據之後,應該再次獲得光標,然後使用當前的光標交換,然後通知更改適配器:

Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 
vehAdapter.swapCursor(mpgCur); 
vehAdapter.notifyDataSetChanged(); 

有沒有必要再次創建適配器。

+0

啊,好吧,這有點整潔,非常感謝... – Nelmo

0

我認爲你的光標沒有更新,儘管數據已經改變。您可能會重新查詢(即進行另一個查詢並獲得新的Cursor實例)。

+0

但是我使用鏈接到遊標的特殊列表適配器 - 根據教程,整個問題的關鍵是讓您只指示遊標重新查詢,並且一切都會爲您完成。是的,我可以編寫自己的代碼來執行查詢並每次重新顯示,但肯定錯過了這一點? – Nelmo

+0

我明白,但我也知道'Cursor.requery()'已棄用。所以,即使這種方法實際上可以完成它的工作,但它不會使用它的良好做法;) –

2

這是因爲您正在使用onCreate方法運行列表初始化。只要將這個部分:

Cursor mpgCur = mpgDB.query(dbMain.TABLE_NAME, PROJECTION, null, null, null, null, null); 

// build a listView 
String[] fromColumns = {dbMain.VEHICLE_NAME}; 
int[] toViews = {android.R.id.text1}; 

vehAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, mpgCur, fromColumns, toViews, 0); 
setListAdapter(vehAdapter); 

onResume()

+0

我希望列表在應用程序啓動後立即顯示 - 是onResume調用的嗎?如果是這樣,我只是重新討論並每次重新宣佈一切 - 似乎效率很低? – Nelmo

+0

是的,onResume在應用程序啓動時調用權利 – birdy

+0

好的,這是可行的 - 非常感謝,儘管我對此不滿意 - 根據Android教程,似乎我正在手動執行listAdapter應該自動執行的操作。 – Nelmo