web-dev-qa-db-ja.com

SimpleCursorAdapterでバインドされたListViewから選択した項目を取得します

私はAndroid開発... iPhoneと.Netの背景から来ています。これに非常によく似た質問を見てきましたが、SimpleCursorAdapterを扱ったものはありませんでした。

カーソルを使用してSQLiteクエリからのデータをListViewにバインドする基本的なListActivityがあります。

ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        Android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {Android.R.id.text1}); 

setListAdapter(adapter);

次に、アイテムをクリックすると:

public void onListItemClick(ListView l, View v, int position, long id) {

    super.onListItemClick(l, v, position,  id);

    //Difference between this:
    Cursor c = (cursor)l.getItemAtPosition(position);
    //and this??
    Cursor c = (Cursor)l.getAdapter().getItem(position);

    int categoryId = c.getInt(0);
}

これは、選択された要素のIDを取得する適切な方法ですか?データベースが閉じられた後(バインド後)にカーソルを使用できないと思うため、奇妙に思えます。そのIDから実際のアイテムを取得する方法が見つからない場合、渡されたIDのポイントは何ですか?また、getItemAtPosition()がカーソルを返す理由がわかりません...カーソルはリスト全体にバインドされています。 1行だけではありません。最後に、これが正しい場合、カーソルを取得する2つの方法に違いはありますか?ありがとう。

37
GendoIkari

いくつかのポイント:カーソルをフェッチした後、startManagingCursorを呼び出します。これにより、カーソルのライフサイクルがアクティビティのライフサイクルと結び付けられます(したがって、アクティビティが破壊されると、カーソルは閉じられる/クリーンアップされます)。

_startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(
        this, 
        Android.R.layout.simple_list_item_1,  
        c,        
        new String[] {"name"},   
        new int[] {Android.R.id.text1}); 
setListAdapter(adapter);
_

また、データベースはclosedではありません。通常、カーソルはDBへのライブ接続を維持します(したがって、ListViewはスクロールし、カーソルのコンテンツへの将来のアクセスを必要とする可能性のある性質を実行できます。

あなたの中心的な質問に、onListItemClickでそれをする最も簡単な方法はこれです:

_Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);
_

その後、c.getLong(0)を使用してIDを取得できます(通常、最初の列としてid列をフェッチしたと仮定します)。ただし、IDは署名の一部として渡されることに注意してください(public void onListItemClick(ListView l, View v, int position, long id)の最後の引数を参照してください)。実際に再度取得する必要はありません(ただし、サイクル)。他の列にアクセスするには、列インデックスを変更するだけで同じことができます。

お役に立てば幸いです。

82
Femi

別の方法:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);
            //TODO
            }
});
0
Yuliia Ashomok