2011-02-25 104 views
3

我想刷新一個使用創建爲SimpleCursorAdapter的ListAdapter的ListView。android:使用ListAdapter和SimpleCursorAdapter刷新ListView

這裏是我在onCreate中創建Cursor和ListAdapter的代碼,它填充ListView。

tCursor = db.getAllEntries();  

ListAdapter adapter=new SimpleCursorAdapter(this, 
       R.layout.row, tCursor, 
       new String[] columns, 
       new int[] {R.id.rowid, R.id.date}); 

setListAdapter(adapter); 

然後,我在另一個方法中添加一些數據到數據庫,但我無法弄清楚如何刷新ListView。在stackoverflow和其他地方的類似問題提到使用notifyDataSetChanged()和requery(),但都不是ListAdapter或SimpleCursorAdapter的方法。

回答

5

我能夠通過創建一個新的適配器並再次調用setListAdapter來刷新ListView。

我在另一種方法中將它命名爲adapter2。

tCursor = db.updateQuery();  

ListAdapter adapter2=new SimpleCursorAdapter(this, 
       R.layout.row, tCursor, 
       columns, 
       new int[] {R.id.rowid, R.id.date}); 

setListAdapter(adapter2); 

我不知道爲什麼這是必要的,但它現在的作品。如果有人有更好的解決方案,我願意嘗試。

+0

也解決了我的問題。我也可以在AsynTask中使用它。 – 2011-09-16 22:46:17

0

在這種情況下,我建議去定製Adapter,通過擴展BaseAdapter類。

+0

正如我在原來的問題中提到,notifyDataSetChanged()不能用於工作一個ListAdapter。 Eclipse給出的錯誤說「方法notifyDataSetChanged()未定義類型ListAdapter」。 – spryan 2011-02-25 04:00:55

+0

重寫有效的代碼有望成爲最後的手段,但我會考慮這一點。感謝您的嘗試。 – spryan 2011-02-25 04:31:07

0

方法notifyDataSetChanged來自SimpleCursorAdapter父類BaseAdapter。母公司執行ListAdapter,你應該能夠將它傳遞給你的ListView

嘗試:

tCursor = db.getAllEntries();  

BaseAdapter adapter=new SimpleCursorAdapter(this, 
      R.layout.row, tCursor, 
      new String[] columns, 
      new int[] {R.id.rowid, R.id.date}); 

setListAdapter(adapter); 


那麼你應該能夠使用notifyDataSetChanged

+1

我按照你的建議將適配器的類型從ListAdapter改爲BaseAdapter。該列表仍然正確加載,但調用adapter.notifyDataSetChanged()不刷新ListView時,我從另一種方法調用它。我使用這個不正確嗎? – spryan 2011-02-25 05:20:41

0

如果需要從同一個類中的其他方法訪問,則可以將適配器定義爲類變量。然後你可以撥打changeCursor()刷新ListView。

public class mainActivity extends AppCompatActivity { 
    // Define the Cursor variable here so it can be accessed from the entire class. 
    private SimpleCursorAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_coordinator_layout) 

     // Get the initial cursor 
     Cursor tCursor = db.getAllEntries();  

     // Setup the SimpleCursorAdapter. 
     adapter = new SimpleCursorAdapter(this, 
      R.layout.row, 
      tCursor, 
      new String[] { "column1", "column2" }, 
      new int[] { R.id.rowid, R.id.date }, 
      CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     // Populate the ListAdapter. 
     setListAdapter(adapter); 
    } 

    protected void updateListView() { 
     // Get an updated cursor with any changes to the database. 
     Cursor updatedCursor = db.getAllEntries(); 

     // Update the ListAdapter. 
     adapter.changeCursor(updatedCursor); 
    } 
} 

如果列表視圖需要從另一個類的方法來更新,適配器變量應聲明public static代替

public static SimpleCursorAdapter adapter;