2013-07-14 21 views
15

Tôi có một listActivity hiển thị CAB khi nhấp chuột dài. Nếu có nhiều hơn 1 mục được chọn, tôi muốn ẩn một trong các mục menu của tôi.Ẩn các mục trong Context Action Bar (CAB) động khi nhiều mục được chọn

Tôi theo dõi số mục được chọn trong onItemCheckedStateChanged(). Tuy nhiên tôi không có quyền truy cập vào menu để xóa mục khỏi chức năng này. Xem ý kiến ​​trong mã dưới đây để có được một ý tưởng về những gì tôi đã cố gắng. Tôi cảm thấy như tôi đang thiếu một số hiểu biết cốt lõi đơn giản ... mã dưới đây được gọi là từ chức năng onCreate() của tôi.

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

Và mục trình đơn của tôi ...

<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

Cảm ơn, đó là những gì tôi đang tìm kiếm. –

Trả lời

28

Như đã đề cập trong bình luận adneal của.

Add vô hiệu() để 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 
} 

này làm mất hiệu lực CAB và làm cho chức năng onPrepareActionMode() được gọi.

@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

Vì lợi ích đầy đủ, bạn cũng có thể gọi 'setEnabled (false) ' –

Các vấn đề liên quan