38

私は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つの方法に違いはありますか?ありがとう。

4

2 に答える 2

83

いくつかのポイント: カーソルをフェッチした後、 を呼び出します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);

また、データベースは閉じられていません。カーソルは通常、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)) ので、再度取得する必要はありません (ただし、サイクルを焼きたい場合は可能です)。他の列にアクセスするには、列のインデックスを変更するだけで同じことができます。

それが役立つことを願っています。

于 2011-05-27T19:43:21.257 に答える