2011-04-19 62 views
3

我想從數據庫中填充ListView,並用幻想刪除按鈕調用每一行。所以我做了List Activity和自定義的SimpleCursorAdapter。自定義SimpleCursorAdapter,數據庫查詢和空指針異常

這是主要的ListView活動:

public class EditEntries extends ListActivity { 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    private static String[] FROM = { _ID, SCORE_COLUMN, 
      "date(time, 'localtime')", }; 
    private static int[] TO = { R.id.rowid, R.id.title, R.id.time, }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entries_list); 
     try { 
      cursor = getEvents(); 
      showEvents(cursor); 
     } finally { 
      db.close(); 
     } 
    } 

    private void showEvents(Cursor cursor) { 
     // Set up data binding 
     SMSimpleCursorAdapter adapter = new SMSimpleCursorAdapter(this, 
       R.layout.entries_list_item, cursor, FROM, TO); 
     setListAdapter(adapter); 

    } 

    private Cursor getEvents() { 
     db.open(); 
     cursor = db.getAllScores(); 
     startManagingCursor(cursor); 
     return cursor; 
    } 

    void delRow() {  // this is method for deleting row by _id 
     db.open(); 
     db.deleteScore(3); // here will be TAG with _id from adapter, 
     db.close();  // for now I just use hardcoded _id 
    } 

} 

這是自SimpleCursorAdapter:

public class SMSimpleCursorAdapter extends SimpleCursorAdapter{ 

    Cursor c; 
    Context context; 
    Activity activity; 

    public SMSimpleCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     this.c = c; 
     this.context=context; 
     this.activity=(Activity) context; 

    } 
    EditEntries dbDel = new EditEntries(); //from previous code sample 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) 
      convertView = View.inflate(context, R.layout.entries_list_item, null); 
     View row = convertView; 

     c.moveToPosition(position); 

     TextView score = (TextView) convertView.findViewById(R.id.title); 
     TextView time = (TextView) convertView.findViewById(R.id.time); 
     TextView id = (TextView) convertView.findViewById(R.id.rowid); 

     id.setText(c.getString(0)); 
     time.setText(c.getString(2)); 
     score.setText(c.getString(1)); 

     String daTag = c.getString(1); 

     ImageButton delButton = (ImageButton) convertView.findViewById(R.id.delButton); 
     delButton.setFocusable(true); 
     delButton.setClickable(true); 
     //delButton.setTag(daTag); 
     delButton.setOnClickListener(new OnClickListener() { //Click listener fro delete button 
      @Override 
      public void onClick(View view) { 
       dbDel.delRow(); //this is "delete row" method from previos code     sample 
      } 
      }); 

     return(row); 
    } 

} 

而這一切的東西給我NullPointerException異常,當我點擊刪除按鈕。 我是Android新手,假設我錯過了一些明顯的東西。

logcat的:

ERROR/AndroidRuntime(14027):致命異常:主

ERROR/AndroidRuntime(14027):顯示java.lang.NullPointerException

ERROR/AndroidRuntime(14027):在android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

ERROR/AndroidRuntime(14027):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHe lper.java:98)

ERROR/AndroidRuntime(14027):在namespace.DBAdapter.open(DBAdapter.java:66)

ERROR/AndroidRuntime(14027):在namespace.EditEntries.delRow(EditEntries。 Java的:50)

ERROR/AndroidRuntime(14027):在namespace.SMSimpleCursorAdapter $ 1.onClick(SMSimpleCursorAdapter.java:64)

ERROR/AndroidRuntime(14027):在android.view.View.performClick(查看.java:2414)

錯誤/ AndroidRuntime(14027):at an droid.view.View $ PerformClick.run(View.java:8838)

ERROR/AndroidRuntime(14027):在android.os.Handler.handleCallback(Handler.java:587)

ERROR/AndroidRuntime( 14027):在android.os.Handler.dispatchMessage(Handler.java:92)

ERROR/AndroidRuntime(14027):在android.os.Looper.loop(Looper.java:123)

ERROR/AndroidRuntime(14027):at android.app.ActivityThread.main(ActivityThread.java:4680)

ERROR/Andro idRuntime(14027):在java.lang.reflect.Method.invokeNative(本機方法)

ERROR/AndroidRuntime(14027):在java.lang.reflect.Method.invoke(Method.java:521)

ERROR/AndroidRuntime(14027):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)

ERROR/AndroidRuntime(14027):在com.android.internal.os.ZygoteInit .main(ZygoteInit.java:616)

錯誤/ AndroidRuntime(14027):at dalvik。system.NativeStart.main(本機方法)

+2

你可以發佈'logcat'輸出嗎? – 2011-04-19 13:03:22

回答

7

的問題是在你的SMSimpleCursorAdapter代碼:

EditEntries dbDel = new EditEntries(); //from previous code sample 

您創建一個新的對象,但它不會是一個管理活動(如onCreate方法。將不會被調用)。當您嘗試第二次(從適配器)創建NPE時,NPE可能來自您的DBAdapter。

快速修復:

EditEntries dbDel; //from previous code sample 
public SMSimpleCursorAdapter(Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 

    this.c = c; 
    this.context = context; 
    this.activity = (Activity) context; 
    this.dbDel = (EditEntries) context; 
} 

如果你不想只是權宜之計以下將是一個更好的解決方案:

  1. 移動的delRow,getEvents方法到您的DBAdapter類
  2. 修改您的SMSimpleCursorAdapter的構造函數以在DBAdapter類(在您的ListActivity中創建)中提供。
+0

是的,正如我懷疑的那樣,日誌支持了我的理論。希望我的回答有幫助。 – balazsbalazs 2011-04-19 13:31:16

+0

謝謝,它工作。 – Sver 2011-04-19 13:40:18