我通过空指针和查询帖子搜索了高低,但仍无法解决此问题。我正在使用自定义适配器对ListView进行充气,然后使用ItemLongClickListener注册它,这会引发上下文菜单。上下文菜单中填充了从数据库中检索到的数据,这些数据夸大了ListView ...相同的行数,显然......但是当我查询第一个项目(为int id传入位置'0')时,我得到一个例外。但是如果我在传入后将它递增1,我会在最后一行得到相同的异常。所有其他行显示查询数据就好了。我可以包含更完整的代码,但我想我在这里缺少一些更基本的东西......任何想法?提前致谢,我的第一个问题 - 如果我的帖子需要以不同的方式完成,请让我知道!
listview.setAdapter(new MyCustomAdapter(text, image));
listview.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View strings,
int position, long id) {
// showToastMessage("" + position);
showDialogOnLongClick(position);
return true;
}
});
对话框构建器,它调用数据库函数:
private void showDialogOnLongClick(int position) {
Builder alert = new AlertDialog.Builder(this);
// AlertDialog alert = new AlertDialog.Builder(this).create();
ArrayList mSelectedItems = new ArrayList();
ArrayList<String> listInfo = getListInfo(position);
...
}
并且,数据库的实际查询:
// Getting single list item data
public ArrayList<String> getListInfo(int id) {
DatabaseHelper helper = new DatabaseHelper(this);
database = helper.getReadableDatabase();
//to increment, or not to increment?
id++;
// Cursor cursor =
// database.rawQuery("SELECT * FROM list_data WHERE _id ='"+ id +"'",
// null);
Cursor cursor = database.query("list_data", new String[] { "listTitle",
"listContent", "dateCreated", "dateModified" }, "_id = " + id
+ "", null, null, null, null);
if (cursor != null && (cursor.getCount() > 0))
cursor.moveToFirst();
ArrayList<String> result = new ArrayList<String>();
result.add(cursor.getString(cursor.getColumnIndex("listTitle")));
result.add(cursor.getString(cursor.getColumnIndex("listContent")));
result.add(cursor.getString(cursor.getColumnIndex("dateCreated")));
result.add(cursor.getString(cursor.getColumnIndex("dateModified")));
return result;
}
logCat:
03-25 15:13:20.113: E/AndroidRuntime(12639): FATAL EXCEPTION: main
03-25 15:13:20.113: E/AndroidRuntime(12639): java.lang.NullPointerException
03-25 15:13:20.113: E/AndroidRuntime(12639): at com.baked.listanywhere.ActivityMain.showDialogOnLongClick(ActivityMain.java:310)
谢谢你看看!
答案 0 :(得分:1)
但是当我查询第一个项目(为int id传入位置'0')时,我得到一个例外。
尝试查找id为0的行很可能会返回一个空的Cursor,SQLite INTEGER PRIMARY KEY
应始终大于零。如果您的自定义适配器是CursorAdapter,那么尝试传递position
而不是传递id
,而id
中的onItemClick
参数是当前行的ID。
当Cursor为空时,此代码将抛出异常,因为您无法从不存在的行读取数据:
if (cursor != null && (cursor.getCount() > 0))
cursor.moveToFirst();
...
result.add(cursor.getString(cursor.getColumnIndex("listTitle"))); // Exception!
更好的方法是检查moveToFirst()
:
if(cursor != null && cursor.moveToFirst()) {
...
result.add(cursor.getString(cursor.getColumnIndex("listTitle")));
}
至于:
java.lang.NullPointerException
at com.baked.listanywhere.ActivityMain.showDialogOnLongClick(ActivityMain.java:310)
MainActivity中的第310行是什么?