2013-07-14 5 views
15

Ich habe eine listActivity, die CAB bei langem Klick anzeigt. Wenn mehr als 1 Artikel ausgewählt ist, möchte ich einen meiner Menüpunkte ausblenden.Elemente in Kontextaktionsleiste (CAB) ausblenden, wenn mehrere Elemente ausgewählt sind

Ich verfolge die Anzahl der Elemente in onItemCheckedStateChanged() ausgewählt. Ich habe jedoch keinen Zugriff auf das Menü, um das Element von dieser Funktion zu entfernen. Sehen Sie sich die Kommentare im folgenden Code an, um eine Vorstellung davon zu bekommen, was ich versucht habe. Ich habe das Gefühl, dass mir ein einfaches Kernverständnis fehlt ... Der Code unten wird von meiner onCreate() Funktion aufgerufen.

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; 
     } 
    }); 

Und mein Menüpunkt ...

<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

Danke, das ist das, was ich suchte. –

Antwort

28

Wie in adneal Kommentar vorgeschlagen.

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

dies zu einem Verlust der CAB und bewirkt, dass die onPrepareActionMode() Funktion aufgerufen werden.

@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

Der Vollständigkeit halber können Sie auch 'setEnabled (false)' aufrufen –