2012-03-30 6 views
14

SimpleCursorAdapterを使用してカーソルからのデータをリストビューに取り込みました。それぞれの項目に対してチェックボックスを使って複数の項目を選択できるようにしたいのですが、項目を選択するたびに1つの項目をチェックするだけです。つまり、現在選択されている項目がクリアされます。Android Listview - カーソルを使用して複数の項目を選択できません

ArrayAdapterを使用してリストビューを作成すると問題はありません。私は複数の項目を選択することができます。だから私はそれがなぜSimpleCursorAdapterで動作しないのかわかりません。

これはDialogFragmentで作成されます。

本当にこれで私の髪を引っ張って、pleaeヘルプ!

ここでは、コードです:

Cursor attributesCursor = mDBHelper.getItemAttributesbyType(menuID, itemID, "M"); 
getActivity().startManagingCursor(attributesCursor); 

ListView lv = new ListView(this.getActivity()); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.FILL_PARENT, 
       LinearLayout.LayoutParams.MATCH_PARENT); 
lv.setLayoutParams(params); 


SimpleCursorAdapter adapter = new SimpleCursorAdapter(
       getActivity(), android.R.layout.simple_list_item_multiple_choice, 
       attributesCursor, new String[] { "AttributeDescription" }, 
       new int[] { android.R.id.text1 },0); 


attributesLinearLayout.addView(lv); 

lv.setAdapter(adapter); 

lv.setItemsCanFocus(false); 
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

編集:私はこのコードを使用している場合 ただ、いくつかの余分な情報を追加するために、マルチ選択リストビューが動作しますが、「アイテム」は、単純な文字列の配列です:

lv.setAdapter(new ArrayAdapter(this.getActivity(), 
      android.R.layout.simple_list_item_multiple_choice, items)); 
は、

また、このリストビューは、他のコントロールを含むダイアログフラグメントの既存のLinearlayout(attributesLinearLayout)に動的に追加されています。私はまた、アレイアダプターや顧客アイテムのレイアウトを含む他のアダプターを拡張しようとしましたが、もう一度、複数のアイテムを選択することができませんでした。

助けてください!

+0

あなたがどんな解決策を見つけるでしたが、私も – dmSherazi

+0

なぜあなたはカスタムカーソルadapteを使用していない同じ問題を抱えていますr?または、複数選択可能なcustomadapterを提供していれば問題は解決しますか? – Droidekas

+0

ArrayAdapterとして機能する場合は、カーソルから配列にデータをコピーしてから、配列アダプターを使用できますか? – Suragch

答えて

1

リストビューで複数の項目を選択する場合は、このプロジェクトではContextual Actionモードを使用します。これはそれがどのように行われるかです。

@Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    String[] values = new String[] { "data list goes here" }; 

    MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values); 
    setListAdapter(adapter); 

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 

     if (mActionMode != null) { 
      return false; 
     } 
     selectedItem = position; 

     // Start the CAB using the ActionMode.Callback defined above 
     mActionMode = MyListActivityActionbar.this.startActionMode(MyListActivityActionbar.this); 
     view.setSelected(true); 
     return true; 
     } 
    }); 
    } 

ザ・あなたはshowメソッドを呼び出す必要があります:すべての

まず、コードがListActivityを拡張してのonCreateでActionMode.Callback

を実装する必要がありますあなたは以下のコードする必要がmedthod

private void show() { 
    Toast.makeText(MyListActivityActionbar.this, String.valueOf(selectedItem), Toast.LENGTH_LONG).show(); 
    } 

アクションモードが表示されるたびに、以下を呼び出す必要があります。常にonCreateActionMode後に呼び出されますが、モードが無効化された場合は、複数回呼び出されることがあります。

@Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    return false; // Return false if nothing is done 
    } 

ユーザーがリスト項目を選択したときに続いて、以下のメソッドが呼び出される必要があります。

@Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menuitem1_show: 
     show(); 
     // Action picked, so close the CAB 
     mode.finish(); 
     return true; 
    default: 
     return false; 
    } 
    } 

最後に、ユーザーが選択を終了したとき:

@Override 
    public void onDestroyActionMode(ActionMode mode) { 
    mActionMode = null; 
    selectedItem = -1; 
    } 
+0

私は配列アダプターのためにそれを行うことができましたが、カーソルアダプターを拡張するカスタムアダプターの場合、actionModeは起動しません – dmSherazi

+0

なぜ 'CursorAdapter'を使用する必要がありますか? –

+0

データがデータベースからロードされるとき。 – dmSherazi

関連する問題