2016-10-24 16 views
9

Tôi đang sử dụng setMultiChoiceModeListener trên Listview để gọi Chế độ hành động để chọn nhiều mục sẽ bị xóa. Trên ListView cuộn Tôi tải thêm dữ liệu từ máy chủ và thông báo cho bộ điều hợp. Sau khi adapter được thông báo, Chế độ Hành động (nếu được gọi) bị hủy và được tạo lại, làm cho tiêu đề và danh sách mảng được chọn trống (Bạn có thể xem hình bên dưới). Trong khi lựa chọn mục listview vẫn còn. Tôi muốn CAB liên tục như chúng ta thấy trong ứng dụng Gmail, nơi nó không phá hủy khi tải thêm dữ liệu.Android CAB hủy sau khi listview notifydatasetchanged

enter image description here

Dưới đây là mã cho Action Mode

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
      listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 
       @Override 
       public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 

         Item mItem = adapter.items.get(position); 
         if (mItem.isSection()) { 
         } else { 
          mode.setTitle(listView.getCheckedItemCount() + " Selected"); 
          EntryItem mEntryItem = (EntryItem) mItem; 
          orderid = mEntryItem.orderId; 
          if (checked) { 
           selectedIdList.add(orderid); 
          } else { 
           selectedIdList.remove(orderid); 
          } 
          // Toggle the state of item after every click on it 
          adapter.toggleSelection(position); 
        } 
       } 

       @Override 
       public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
        if (item.getItemId() == R.id.delete){ 

         if (selectedIdList.size() > 0) { 
          deleteItems(selectedIdList); 
         } 
         mode.finish(); 
         return true; 
        } 
        return false; 
       } 


       @Override 
       public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
        mode.getMenuInflater().inflate(R.menu.menu_main, menu); 
        actionMode = mode; 
        return true; 
       } 


       @Override 
       public void onDestroyActionMode(ActionMode mode) { 
        actionMode = null; 
        if (selectedIdList.size() > 0) { 
         selectedIdList.clear(); 
         adapter.mSelectedItemsIds.clear(); 
        } 
       } 


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

Bất kỳ trợ giúp sẽ được đánh giá cao, cảm ơn trước.

+0

cố gắng xóa chế độ.finish() khỏi mục có thể ngăn chặn tái tạo. –

+0

hãy thêm nhật ký vào đây để có thể xem lại nó –

+0

@parikdhakan 'mode.finish()' trong 'onActionItemClicked' được gọi là nhấn vào biểu tượng xóa trong' actionbar', nếu không nó sẽ không được gọi ở đó. –

Trả lời

0

Bạn cần phải lưu chọn mục id để giữ lại nhà nước và hiển thị như chọn sau khi bạn làm mới/thông báo thay đổi bộ chuyển đổi như thể hiện trong ví dụ dưới đây:

1) https://androidperspective.wordpress.com/2013/04/17/contextual-action-bar-with-listview/

(Nó cho thấy lựa chọn và tiết kiệm id mục đã chọn trong mảng để lưu trạng thái).

2) http://theopentutorials.com/examples/android/listview/android-contextual-action-bar-for-listview-item-deletion-using-actionbarsherlock/

(Nó cho thấy ví dụ hoàn chỉnh bạn muốn xóa chỉ sử dụng thanh hành động sherlock nó sẽ là ít chỉ thay đổi).

Vui mừng khi biết điều đó có hữu ích cho bạn hay không.

+0

Việc lựa chọn không phải là một vấn đề như tôi đã đề cập rằng các mục vẫn được chọn, vì vậy tôi có thể nhận được chúng. Vấn đề là trong khi danh sách làm mới CAB biến mất (đôi khi hai lần) và sau đó nó trở nên có thể nhìn thấy. Trong khi gỡ lỗi người ta có thể dễ dàng thấy rằng 'onCreateActionMode' được gọi lại trong khi làm mới danh sách. Nếu bạn đang sử dụng Gmail, bạn có thể thấy rằng CAB không phá hủy và tạo lại trong khi tải thêm dữ liệu. –

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