2012-07-26 11 views
6

コンテキストメニューを操作できるように、IDの代わりにカーソルの現在のレコードを取得したいとします。カーソルからContextMenuへデータを取得する方法

私はIDを取得する方法を示します、この例hereを見ました:

@Override 
    public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case DELETE_ID: 
     AdapterView.AdapterContextMenuInfo info= 
      (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 

     delete(info.id); 
     return(true); 
    } 

    return(super.onOptionsItemSelected(item)); 
    } 

それは私が私が書くことができるようになりますクリックコンテキストメニューの適切なSQLiteデータベースのIDを取得することができますので、これは素晴らしいです検索を行う関数。しかし、確かに私は現在のカーソルを再利用できますか?

私はこれをやってみました:

Cursor c = (Cursor) this.getListAdapter().getItem((int) info.id); 
String itemPriority = c.getInt(1); 
Log.v(TAG, "Current item:" + itemPriority); 

が、カーソル行だけでデータベースのスキーマの代わりに、私は後だレコードを返すように思えます。

誰かに光をあててください。

編集:@ azgolferのおかげで解決策が見つかりました。私は、fillData()メソッドを使用してアダプタを生成します。通常これは変数なしで宣言されます。フィールド変数を使ってこのメソッドを再定義する必要がありました。 onContextItemSelectedでcurstorアダプタが表示されるようにするコードの関連部分はここにある:

private void fillData() { 
    Cursor itemsCursor = mDbHelper.fetchAllItemsFilter(mListId, mStatusFilter); 
    startManagingCursor(itemsCursor); 
    mItemAdaptor = new ItemAdapter(this, itemsCursor); 
    this.setListAdapter(mItemAdaptor);  
} 
+0

あなたは再利用とはどういう意味ですか

まず、ユーザーが押されたものの位置を決定しますか?そして、 'c.getInt(1)'は、そのカーソル行のインデックス1を取得しています。だから、 'c.getString(2)'のように、そのカーソル行の他のインデックスからレコードを取得するだけです。あなたが何か他のことをしようとしていない限り。 – Andy

+0

申し訳ありません私は仕事の再利用は "使用する"と思う。ただし、カーソルはデータを返さず、スキーマだけを返します。 –

+0

'itemPriority'に表示されているものを印刷してください。 – Andy

答えて

13

あなたは正しい、あなたのリスト項目を表示するには、CursorAdapterを使用していますか?次に、CursorAdapter自体でgetCursor()を呼び出すことで、カーソルにアクセスできます。カーソルから正しいレコードを取得するには、ユーザーが押した項目の位置を取得してから、カーソルをその位置に移動してデータを取得する必要があります。希望の位置にカーソルを移動し、レコードを取得後

AdapterView.AdapterContextMenuInfo info= 
     (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
int itemPosition = info.position; 

Cursor cursor = (Your cursorAdapter).getCursor(); 
cursor.moveToPosition(itemPosition); 
String itemPriority = cursor.getInt(1); 
Log.v(TAG, "Current item:" + itemPriority); 
+0

あなたの答えは私が解決策を見つけるのを助けました。問題は、アダプタをフィールド変数として宣言できるかどうかわからなかったことです。元の質問を更新して、アダプターを定義する場所を追加しました。 –

+0

非常に役立つazgolfer、ありがとう、トン! – Soham

関連する問題