2013-07-14 6 views
15

私は長いクリックでCABを表示するlistActivityを持っています。 1つ以上のアイテムが選択されている場合、私のメニューアイテムの1つを隠したいと思います。複数の項目が選択されているときに、コンテキスト・アクション・バー(CAB)内の項目を非表示にする

onItemCheckedStateChanged()で選択したアイテムの数を把握しています。しかし、私はこの機能からアイテムを削除するメニューにアクセスする必要はありません。私が何をしようとしているのかを知るには、以下のコードのコメントを参照してください。私はいくつかの単純なコアの理解が不足しているように感じる...下のコードは私のonCreate()関数から呼び出されます。

private void setupActionBarContext() { 
    ListView listView = getListView(); 
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

     private int selCount = 0; 
     ArrayList<Long> idList = new ArrayList<Long>(); 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 
      if (checked) { 
       selCount++; 
       idList.add(id); 
      } else { 
       selCount--; 
       idList.remove(id); 
      } 
      mode.setTitle(selCount + " selected"); 

      // I WOULD LIKE TO HIDE ITEM ON MENU IF 'selCount' IS > 1 
      // For example something like this... 

      //    if (selCount > 1) { 
      //     MenuItem item = menu.findItem(R.id.edit_item); 
      //     item.setVisible(false); 
      //    } else { 
      //     MenuItem item = menu.findItem(R.id.edit_item); 
      //     item.setVisible(false); 
      //    } 

     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.delete_item: 
        for(Long i: idList){ 
         mDbHelper.deleteItem(i); 
        } 
        mode.finish(); 
        return true; 
       case R.id.edit_item: 
        Toast.makeText(getBaseContext(), "Edit Item", Toast.LENGTH_SHORT).show(); 
        mode.finish(); // Action picked, so close the CAB 
        return true; 
       default: 
        return false; 
      } 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      // Inflate the menu for the CAB 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.context_menu, menu); 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      selCount = 0; 
      idList.clear(); 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      return false; 
     } 
    }); 

そして、私のメニュー項目...

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/edit_item" 
     android:title="@string/edit_item" 
     android:showAsAction="ifRoom" 
     android:orderInCategory="1"/> 
    <item android:id="@+id/delete_item" 
     android:title="@string/delete_item" 
     android:icon="@drawable/ic_action_delete" 
     android:showAsAction="ifRoom" 
     android:orderInCategory="2"/> 
</menu> 
+3

[ActionMode.invalidate](http://developer.android.com/reference/android/view/ActionMode.html#invalidate()) – adneal

+0

おかげで、それは私が探していたものです。 –

答えて

28

adnealさんのコメントで示唆したように。 onItemCheckedStateChanged()

@Override 
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 
    if (checked) { 
     selCount++; 
     idList.add(id); 
    } else { 
     selCount--; 
     idList.remove(id); 
    } 
    mode.setTitle(selCount + " selected"); 

    mode.invalidate(); // Add this to Invalidate CAB 
} 

から

追加無効()がこのCABを無効にし、onPrepareActionMode()関数が呼び出されます。

@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    if (selCount == 1){ 
     MenuItem item = menu.findItem(R.id.edit_item); 
     item.setVisible(true); 
     return true; 
    } else { 
     MenuItem item = menu.findItem(R.id.edit_item); 
     item.setVisible(false); 
     return true; 
    } 
} 
+0

完全性のために 'setEnabled(false)'を呼び出すこともできます。 –

関連する問題