ListFragmentのサブクラスでリストアイテムを取得する

Android 1.6にSupport Libraryを導入してListFragmentのサブクラスを作成しました。そして、SQLiteのテーブルから取得したデータをリスト表示し、そのリスト項目の一つを選択したときの処理を実装したのですが、なかなか想定通りに動いてくれません。Android SDKに慣れていないと、このような箇所でハマってしまいます。

具体的にやりたいことは、任意のリスト項目を選択し、その選択したリスト項目に表示されている文字列を取得すること。その後デバッグし色々と調査したところ、下記のコードで想定通りに動作しました。

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    Cursor c = (Cursor) getListView().getItemAtPosition(position);
    Toast.makeText(getActivity(), c.getString(1), Toast.LENGTH_LONG).show();
}

当初は書籍やブログ等を参考にしてgetItemAtPositionメソッドを下記のように使用してStringを取得したのですが、ここでエラーが発生していたのです。

String item = (String)l.getItemAtPosition(position);

そこで、直接Stringを取得するのではなくCursorオブジェクトを取得し、その後Curosrにおいて取得したいカラムを指定しました。それが、c.getString(1)という部分です。(最初のカラムを取得したい場合は1ではなく0を指定) このように実装して、リストに表示されている文字列が取得できました。

なお、SQLiteのテーブルからデータを取得し、リスト表示させる処理は下記のように実装しました。このメソッドを、ListFragmentのサブクラスにてonCreateView()の中から呼び出します。

private void fillData() {
    CursorLoader loader = new CursorLoader(getActivity(), 
                   CONTENT_URI, PROJECTION, null, null, null);
		
    mCursor = loader.loadInBackground();
	
    String[] from = new String[] { "column1" };

    int[] to = new int[] { android.R.id.text1 };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(),
                   android.R.layout.simple_list_item_1, mCursor, from, to);
    setListAdapter(adapter);		
}

上記のmCursorはCursor型、CONTENT_URIはコンテンツプロバイダの定義済みURI、PROJECTIONは取得したいカラムのString配列です。