2011-07-11 24 views
1

データベースから照会されたアイテムの単一選択(例:ラジオボタン)リストを作成しようとしています。現在選択されている行を操作するには、ListViewのgetCheckedItemPosition()setItemChecked()メソッドを使用する必要があります。ListAdapterの行IDからListViewアイテムIDを取得する

ListViewにはSimpleCursorAdapterが設定されています。現在選択されているアイテムを取得するときは、ローIDがデータベースから取得されます。これは適切なアイテムを見つけて前述の方法で手動で選択する必要があります。つまり、行IDの状態を必然的に単調な行IDにマッピングする必要があります(setItemChecked()メソッドはデータベース行IDではなく、位置IDを受け入れ、データベースでアイテムを削除できるため)。

私はテーブルの行IDから位置IDを取得する方法はありますか?可能であれば、私はむしろ検索をすることに頼っていません。

ありがとうございました。

+0

私はあなたの質問が正しい場合(私は願っています)私はあなたがKeyValuePairを使うべきだと思います、キーは行idであり、値は位置IDです。位置の数を維持するために、カウンタを使用して、クエリに基づいて項目が追加されるたびに更新することができます。 –

+0

事実ですが、私は 'SimpleCursorAdapter'をSQLiteクエリの' Cursor'で使用します。これはすべて自動的に行われます。つまり、startManagingCursor()を使用します。アイテムを追加したときに傍受して(おそらく 'SparseIntArray'を使って)インデックスを作成できるようにする方法はありますか?それとも私がこのように間違っているのか? –

答えて

4

私は(順序であると仮定されている)すべての項目を検索し、簡単な方法で作成することになった:

/** 
* Since Android apparently provides no way to do this, do a simple binary 
* search for the item position based on its row id. 
* @param adapter The adapter to use 
* @param row The rowId to search for 
* @param left 
* @param right 
* @return Position, or -1 if not found 
*/ 
public int getPositionFromRowId(ListAdapter adapter, long row, int left, int right) { 
    if (left > right) 
     return -1; 
    int middle = (left + right)/2; 
    if (adapter.getItemId(middle) == row) 
     return middle; 
    if (adapter.getItemId(middle) > row) 
     return getPositionFromRowId(adapter, row, left, middle - 1); 
    else 
     return getPositionFromRowId(adapter, row, middle + 1, right); 
} 

編集:このような何かをすることによって、このコードを使用します。

getPositionFromRowId(myListAdapter, row, 0, myListAdapter.getCount()); 
関連する問題