ListView无法使用SimpleCursorAdapter和ListAdapter

时间:2015-10-08 10:15:17

标签: sqlite android-listview simplecursoradapter listadapter

我知道有很多类似的问题,并且发誓我已经尝试了所有这些问题。 我正在存储一个字符串和数据库,并希望将其作为列表检索。这是使用ListAdapter完成的(我遵循了ToDo列表教程)。

问题是,我想为从DB中检索到的列表实现OnItemClickListener。但是,当我将ListAdapter替换为ListView时,该应用程序将开始与NullPointException崩溃。

以下是代码:

public class OfflineActivity extends ListActivity {
private ListAdapter listAdapter;
private TaskDBHelper helper;
ListView listView;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.offline_list);
    updateUI();

}

private void updateUI() {
    helper = new TaskDBHelper(OfflineActivity.this);
    SQLiteDatabase sqlDB = helper.getReadableDatabase();
    Cursor cursor = sqlDB.query(TaskContract.TABLE,
            new String[]{TaskContract.Columns._ID, TaskContract.Columns.TASK},
            null, null, null, null, null);

    listAdapter = new SimpleCursorAdapter(
            this,
            R.layout.offline_item,
            cursor,
            new String[]{TaskContract.Columns.TASK},
            new int[]{R.id.taskTextView},
            0
    );

listView = (ListView) findViewById(R.id.list);
this.setListAdapter(listAdapter);
listView.setAdapter(listAdapter);
}
}

应用程序正常工作,直到我放listView.setAdapter(listAdapter);。有没有办法在不对代码进行太多更改的情况下实现OnItemClickListener

以下是XML文件:

offline_list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@android:id/list"
    android:layout_weight="1" />

offline_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/taskTextView" />

PS。我确信listAdapter不是空的。如果我不添加最后一行,list会填充。从那以后坚持了2天。帮助

2 个答案:

答案 0 :(得分:0)

目前,您声明了一个listView,但您从未为其分配值。 在设置适配器之前,需要将listView绑定到布局。

listView = (ListView) findViewById(R.id.list);
this.setListAdapter(listAdapter);
listView.setAdapter(listAdapter);

答案 1 :(得分:0)

当您的OfflineActivity延长ListActivity并且您已正确将ListView ID设为@android:id/list时,您无需通过ListView引用findViewById(R.id.list) {1}}因为它将在ListActivity的实现中默认引用。所以不需要这两行:

listView = (ListView) findViewById(R.id.list);
listView.setAdapter(listAdapter);

事实上,this.setListAdapter(listAdapter);正在将适配器附加到ListView。 要为您的列表实现OnClickListener,只需覆盖onListItemClick()的{​​{1}},如下所示:

ListActivity

OfflineActivity