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。
当我从 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。