当前我使用的是列表视图,该列表视图包含三个值,ID、Title和Description。
这是列表视图的XML。。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/Ln"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:scrollbars="horizontal"
android:weightSum="4" >
<TextView
android:id="@+id/txtNoteID"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.39"
android:gravity="center"
android:text="0"
android:textSize="20sp" />
<TextView
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20sp"
android:text="Pub" />
</LinearLayout>
<TextView
android:id="@+id/txtDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="20sp"
android:text="PubTest" />
</LinearLayout>
该列表由数据库中的数据填充,在此之前一切正常。然而,我确实需要能够从数据库中删除项目,我认为在单击项目时使用上下文菜单将是最简单的,因为用户可以选择要删除的项目。然而,我得到这个错误
"java.lang.NullPointerException:尝试调用虚拟方法null上的"java.lang.CharSequence android.widget.TextView.getText()"对象参考">
这是上下文菜单删除代码。。。
public boolean onContextItemSelected(MenuItem item)
{
//AdapterView.AdapterContextMenuInfo Info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.DeleteItem: {
DB = new DBController(getApplicationContext());
SQLiteDatabase db = DB.getWritableDatabase();
db.delete("NOTES", "ID=" + NoteID.getText().toString(), null);
Toast.makeText(StoredNoteList.this, "deleted successfully", Toast.LENGTH_SHORT).show();
Adapter.notifyDataSetChanged();
return true;
}
}
我很确定问题出在NoteID.getText().toString()上——我的理论是,当我从列表中选择某个项目时,所选的项目ID不会保存在NoteID变量中,但这只是一个理论。
对于那些要求提供NoteID的人声明和分配NoteID
TextView NoteID,NoteTitle,NoteDesc;
NoteID=(TextView)findViewById(R.id.txtNoteID);
在做了一些更改之后,我现在看到我的NoteID肯定是空的
public boolean onContextItemSelected(MenuItem item)
{
//AdapterView.AdapterContextMenuInfo Info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
NoteList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ID =((TextView)parent.findViewById(R.id.txtNoteID)).getText().toString();
}
});
switch (item.getItemId())
{
case R.id.DeleteItem:
{
DB = new DBController(getApplicationContext());
SQLiteDatabase db = DB.getWritableDatabase();
db.delete("NOTES", "ID=" + ID, null);
Toast.makeText(StoredNoteList.this,"deleted successfully", Toast.LENGTH_SHORT).show();
Adapter.notifyDataSetChanged();
return true;
}
调试器显示NoteID为null,我认为一旦我找到了将项列表中选定的id存储到NoteID变量中的方法,我的应用程序应该不会出现问题。
这是我的适配器代码,适用于任何感兴趣的
Adapter = new SimpleAdapter(StoredNoteList.this, Data, R.layout.rows,new String[]{"ID","TITLE","DESCRIPTION"}, new int[]{R.id.txtNoteID,R.id.txtTitle,R.id.txtDesc});
NoteList.setAdapter(Adapter);
任何帮助都将不胜感激,感谢
您是否使用自定义适配器?我认为你的问题是它不知道该得到哪个NoteID。由于ListView,实际上有一堆具有txtNoteID的元素。所以你会想做一些类似于的事情
NoteList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ID = view.getText().toString();
}
});
onItemClick中的视图应该是正确的视图,您可能需要获取父项并在该列表的上下文中查找txtNoteID查看项目,尽管如此…
((TextView)parent.findViewById(R.id.txtNoteID)).getText().toString()