选择Listview项,给出空对象引用错误

时间:2016-05-22 19:54:08

标签: android listview null

目前,我正在使用列表视图,列表视图包含三个值,ID,标题和说明。

以下是列表视图的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>

列表中填充了数据库中的数据,到目前为止一切正常。但是我确实需要能够从数据库中删除项目,我认为当单击项目时有一个上下文菜单将是最简单的,因为用户可以选择要删除的项目。但是我收到此错误

  

&#34; java.lang.NullPointerException:尝试调用虚方法   &#39; java.lang.CharSequence android.widget.TextView.getText()&#39;在null   对象参考&#34;

这是上下文菜单删除代码......

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,我想一旦我找到一种方法将itemList中的选定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);

任何帮助将不胜感激, 谢谢

1 个答案:

答案 0 :(得分:0)

您使用的是自定义适配器吗?我认为您的问题是它不知道要获取的WHICH NoteID。由于ListView,实际上有一堆带有txtNoteID的元素。所以你想要做的事情是:

 ((TextView)parent.findViewById(R.id.txtNoteID)).getText().toString()

onItemClick中的视图应该是正确的视图,您可能需要抓取父视图并在该listView项的上下文中查找txtNoteID,尽管如此...

right