2013-07-14 17 views
15

I have a listActivity che mostra CAB su clic lungo. Se è selezionato più di 1 elemento, vorrei nascondere una delle mie voci di menu.Nascondere gli elementi in Context Action Bar (CAB) dinamicamente quando sono selezionati più elementi

Tengo traccia del numero di articoli selezionati in onItemCheckedStateChanged(). Tuttavia, non ho accesso al menu per rimuovere l'elemento da questa funzione. Vedi i commenti nel codice qui sotto per avere un'idea di cosa stavo provando. Mi sento come se mi mancasse qualche comprensione di base semplice ... codice qui sotto è chiamato dalla mia funzione 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; 
     } 
    }); 

E la mia voce di menu ...

<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

Grazie, questo è quello che stavo cercando. –

risposta

28

Come suggerito nel commento di adneal.

Add invalidate() per 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 
} 

Ciò invalida la CAB e fa sì che la funzione onPrepareActionMode() da chiamare.

@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

Per completezza puoi anche chiamare 'setEnabled (false)' –

Problemi correlati