2013-07-14 9 views
15

Uzun tıklatmayla CAB'yi gösteren bir liste var. 1'den fazla öğe seçilirse, menü öğelerinden birini gizlemek istiyorum.Öğeleri birden çok öğe seçildiğinde Dinamik olarak İçeriği Eylem Çubuğunu (CAB) gizleyin

onItemCheckedStateChanged()'da seçilen öğelerin sayısını takip ediyorum. Ancak öğeyi bu işlevden kaldırmak için menüye erişemiyorum. Neyi denediğime dair bir fikir edinmek için aşağıdaki koddaki yorumları görün. Bazı temel çekirdek anlama eksik hissediyorum ... benim onCreate() işlevinden aşağıdaki kod denir.

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

Ve menü öğesi

... adneal yorumuna da önerildiği gibi

<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

Teşekkürler, bu benim aradığım buydu. –

cevap

28

. 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 
} 

için

Ekleme invalidate() Bu CAB'i geçersiz ve onPrepareActionMode() fonksiyon çağrılacak neden olur.

@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

Bütünlük uğruna “setEnabled (false)” diyebilirsiniz. –

İlgili konular