Android: NullPointerException: cursoradapter, populating listview

Android: NullPointerException: cursoradapter, populating listview

当我从 ShowRecords class 调用方法时出现 NullPointerException。 当我在 DBAdapter 中使用相同的方法并在 ShowRecords class.

中调用它时,它工作正常

这是我的 DBAdapter class 具有方法 getAllMeter()。

 //---------getting data from sqlite-------------


public Cursor getAllMeter() {
    Cursor c;
    db = this.getReadableDatabase();
    String[] All_Columns = new String[] { COLUMN_METER_ID, COLUMN_METER_DATE, COLUMN_METER_START, COLUMN_METER_END, COLUMN_METER_CAR_ID };
    c = db.query(TABLE_METER, All_Columns, null, null, null, null, null);
    if (c != null) {
        c.moveToNext();
    }
    return c;
}

这是我的 MeterAdapter class。当我从 DBAdapter class 调用 getAllMeter() 时。它工作正常我可以填充列表视图

public class MeterAdapter extends Activity {
DBAdapter dbh;
SQLiteDatabase db;
SimpleCursorAdapter mycursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_view_records);
    dbh = new DBAdapter(this);
    populateListview();
}

public void populateListview() {

    Cursor cursor;
    cursor = dbh.getAllMeter();
    startManagingCursor(cursor);
    String[] fromfields = new String[] { 
            DBAdapter.COLUMN_METER_DATE,
            DBAdapter.COLUMN_METER_START, 
            DBAdapter.COLUMN_METER_END,
            DBAdapter.COLUMN_METER_CAR_ID };
    int[] tofields = new int[] { 
            R.id.meterdate, 
            R.id.meterstart,
            R.id.meterend,
            R.id.fk};
    mycursor = new SimpleCursorAdapter(this, R.layout.row_meter, cursor,
            fromfields, tofields, 0);
    ListView mylist = (ListView) findViewById(R.id.list);

这是我的 ShowRecords class 有方法 getMeterRecords()

public class ShowRecords extends Activity {

SQLiteDatabase db;
DBAdapter dbh;

Button show_result;

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

    show_result = (Button) findViewById(R.id.button_showresult);

    show_result.setOnClickListener(new View.OnClickListener() {

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

public Cursor getMeterRecords() {

    dbh = new DBAdapter(ShowRecords.this);

    db = dbh.getWritableDatabase();

    Cursor c;
    String[] All_Columns = new String[] { DBAdapter.COLUMN_METER_ID,
            DBAdapter.COLUMN_METER_DATE, DBAdapter.COLUMN_METER_START,
            DBAdapter.COLUMN_METER_END };
    c = db.query(DBAdapter.TABLE_METER, All_Columns, null, null, null,
            null, null);
    if (c != null) {
        c.moveToNext();
    }
    return c;
}

这是 MeterAdapter class 我从 ShowRecord class

调用 getMeter()
public class MeterAdapter extends Activity {
DBAdapter dbh;
SQLiteDatabase db;
SimpleCursorAdapter mycursor;
ShowRecords showRecords;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_view_records);
    //dbh = new DBAdapter(this);
    showRecords= new ShowRecords(); // referencing ShowRecords class
    populateListview();
}

public void populateListview() {

    Cursor cursor;
    cursor = showRecords.getMeterRecords();
    //cursor = dbh.getAllMeter();
    startManagingCursor(cursor);
    String[] fromfields = new String[] { 
            DBAdapter.COLUMN_METER_DATE,
            DBAdapter.COLUMN_METER_START, 
            DBAdapter.COLUMN_METER_END,
            DBAdapter.COLUMN_METER_CAR_ID };
    int[] tofields = new int[] { 
            R.id.meterdate, 
            R.id.meterstart,
            R.id.meterend,
            R.id.fk};
    mycursor = new SimpleCursorAdapter(this, R.layout.row_meter, cursor,
            fromfields, tofields, 0);
    ListView mylist = (ListView) findViewById(R.id.list);

它给了我以下 nullpointerException

 02-20 03:39:08.663: E/AndroidRuntime(392): FATAL EXCEPTION: main
02-20 03:39:08.663: E/AndroidRuntime(392): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mscprojectimagebuttons/com.munawwar.sultan.cursoradapter.MeterAdapter}: java.lang.NullPointerException
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.app.ActivityThread.access0(ActivityThread.java:149)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.os.Looper.loop(Looper.java:153)
02-20 03:39:08.663: E/AndroidRuntime(392):  at android.app.ActivityThread.main(ActivityThread.java:4987)
 02-20 03:39:08.663: E/AndroidRuntime(392):     at java.lang.reflect.Method.invokeNative(Native Method)
02-20 03:39:08.663: E/AndroidRuntime(392):  at java.lang.reflect.Method.invoke(Method.java:511)
02-20 03:39:08.663: E/AndroidRuntime(392):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
02-20 03:39:08.663: E/AndroidRuntime(392):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
02-20 03:39:08.663: E/AndroidRuntime(392):  at dalvik.system.NativeStart.main(Native Method)
02-20 03:39:08.663: E/AndroidRuntime(392): Caused by: java.lang.NullPointerException
02-20 03:39:08.663: E/AndroidRuntime(392):  at com.munawwar.sultan.showrecordsdatewise.showrecordsBetweenDates.getMeterRecords(showrecordsBetweenDates.java:183)
  02-20 03:39:08.663: E/AndroidRuntime(392):    at com.munawwar.sultan.cursoradapter.MeterAdapter.populateListview(MeterAdapter.java:39)
 02-20 03:39:08.663: E/AndroidRuntime(392):     at com.munawwar.sultan.cursoradapter.MeterAdapter.onCreate(MeterAdapter.java:31)
 02-20 03:39:08.663: E/AndroidRuntime(392):     at android.app.Activity.performCreate(Activity.java:5020)
 02-20 03:39:08.663: E/AndroidRuntime(392):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
 02-20 03:39:08.663: E/AndroidRuntime(392):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)  
 02-20 03:39:08.663: E/AndroidRuntime(392):     ... 11 more

这里:

dbh = new DBAdapter(ShowRecords.this);

导致问题的行是因为 ShowRecords Activity 在 MeterAdapter 中创建 ShowRecords 对象调用 getMeterRecords 方法时 运行 class.

只是为了测试在 getMeterRecords() 方法中添加上下文参数,例如:

public Cursor getMeterRecords(Context context) {
    dbh = new DBAdapter(context);
    ...
}

通过传递 MeterAdapter 的上下文调用 getMeterRecords class:

cursor = showRecords.getMeterRecords(MeterAdapter.this);

所以结论是,如果 Activity 作为实用程序 class,则无需在 ShowRecords class 中扩展 Activity。