2011-12-09 116 views
1

我在理解如何讓我的ListView更新時遇到了一些麻煩。當用戶點擊列表項目時,該項目將從數據庫中刪除,ListView應該更新以不再顯示它。但是,列表不會更新,我不確定我是否正確。與ListView適配器混淆

這裏是我的代碼:

package com.typhoon2099.mediacatalogue; 

import android.os.Bundle; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.BaseAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

    public class DVDs extends ListActivity { 
    private DatabaseHelper database; 
    private static final String MEDIA_TYPE = "DVD"; 
    private Cursor ListCursor; 
    private BaseAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     database = new DatabaseHelper(this); 
     database.open(); 

     ListCursor = database.selectMedia(MEDIA_TYPE); 
     database.close(); 
     startManagingCursor(ListCursor); 

     adapter = new SimpleCursorAdapter(this, 
      R.layout.listlayout, 
      ListCursor, 
      new String[] {DatabaseHelper.TABLE_NAME+".title", DatabaseHelper.TABLE_NAME+".author"}, 
      new int[] {R.id.text1, R.id.text2}); 
     setListAdapter(adapter); 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 

     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
       database.open(); 
       database.deleteMedia(String.valueOf(id)); 
       ListCursor = database.selectMedia(MEDIA_TYPE); 
       adapter.notifyDataSetChanged(); 
       setListAdapter(adapter); 
       database.close(); 
      } 
     }); 
    } 
} 

我正確地知道數據庫更新時,您退出並重新輸入應用程序列表中顯示爲它應該,它只是當一個項目被刪除時不更新。

回答

0

請在您的適配器上撥打notifyDataSetChanged()

+0

'adapter.notifyDataSetChanged();'?更新遊標後已經存在。 –

+0

爲什麼使用setListAdapter(adapter);在onitemclicklistner? –

+0

因爲我不確定如何獲取列表來更新,並認爲可能會導致列表重新加載或什麼。 –

0

此變種是否有效?

lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      database.open(); 
      database.deleteMedia(String.valueOf(id)); 
      database.close(); 
      adapter.notifyDataSetChanged(); // maybe use notifyDataSetInvalidated() 
     } 
    });