我正在尝试基于this教程实现可排序的listView。我的数据库有以下列:
当我在数据库中插入新数据时,我设置了NAME和GROUP列,ID是自动生成的。起初我没有在ORDER列中引入任何内容,因为我需要稍后修改此值,并且第一次不相关。
所以,在第一个活动中,我在数据库中插入了以前注释的列,然后我转到listActivity,其中将显示带有名称的listview。我可以介绍几个不同的名称,然后使用GROUP列组织它们。因此,当我想读取数据库以在listview上绑定结果时,我会查询特定的GROUP。
这里有ORDER列的功能,如果该组已经存在于数据库中,它将加载订单并按照该顺序将名称放在listview中。但如果它是一个新组,ORDER列将为空,当对listview上的项进行排序时,我将定义每个项的顺序。
我的问题:
从数据库为空的点开始,所以没有订单被建立,当我尝试查询特定的组时,起初我遇到了订单列的问题,因为它告诉该列没有存在或类似的东西。但现在,我得到了一个带有适配器构造函数的NPE,我不知道它是否与它或查询有关。
这是数据库列的投影:
String[] PROJECTION = {_ID, .NAME, GROUP, ORDER};
在这里,我阅读了一个特定的数据库组,并将其绑定在listview(以及我获得NPE的地方):
String selection = GROUP + "=?";
String[] selectionArgs = new String[] {group};
String orden = ORDER + " ASC";
try {
cursor = getContentResolver().query(TravelOrderProvider.CONTENT_URI, PROJECTION, selection , selectionArgs , orden);
} catch (Exception e) {}
ListAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, null, null); //NPE HERE
setListAdapter(mAdapter);
cursor.close();
仍然需要检查数据库中是否存在组。
LogCat补充道:
06-10 15:52:28.473: E/AndroidRuntime(18016): FATAL EXCEPTION: main
06-10 15:52:28.473: E/AndroidRuntime(18016): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.irvvin.carpooling/com.irvvin.carpooling.SetTravelOrderActivity}: java.lang.NullPointerException
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread.access$600(ActivityThread.java:139)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.os.Looper.loop(Looper.java:154)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread.main(ActivityThread.java:4944)
06-10 15:52:28.473: E/AndroidRuntime(18016): at java.lang.reflect.Method.invokeNative(Native Method)
06-10 15:52:28.473: E/AndroidRuntime(18016): at java.lang.reflect.Method.invoke(Method.java:511)
06-10 15:52:28.473: E/AndroidRuntime(18016): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-10 15:52:28.473: E/AndroidRuntime(18016): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-10 15:52:28.473: E/AndroidRuntime(18016): at dalvik.system.NativeStart.main(Native Method)
06-10 15:52:28.473: E/AndroidRuntime(18016): Caused by: java.lang.NullPointerException
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.support.v4.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:66)
06-10 15:52:28.473: E/AndroidRuntime(18016): at com.irvvin.carpooling.SetTravelOrderActivity.getTravelers(SetTravelOrderActivity.java:95)
06-10 15:52:28.473: E/AndroidRuntime(18016): at com.irvvin.carpooling.SetTravelOrderActivity.onCreate(SetTravelOrderActivity.java:51)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.Activity.performCreate(Activity.java:4531)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
06-10 15:52:28.473: E/AndroidRuntime(18016): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)
答案 0 :(得分:2)
ListAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cursor, null, null); //NPE HERE
而不是null, null
你必须传递2个数组:
具有列名的字符串数组和具有行ID(来自布局)android.R.layout.simple_list_item_1
示例:
ListAdapter adapter = new SimpleCursorAdapter(this, // Context.
android.R.layout.two_line_list_item, // Specify the row template
// to use (here, two
// columns bound to the
// two retrieved cursor
// rows).
mCursor, // Pass in the cursor to bind to.
// Array of cursor columns to bind to.
new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME },
// Parallel array of which template objects to bind to those
// columns.
new int[] { android.R.id.text1, android.R.id.text2 });
来源:http://www.vogella.com/tutorials/AndroidListView/article.html#cursor