2016-10-24 1 views
9

Я использую setMultiChoiceModeListener по адресу Listview, чтобы вызвать Action Mode для выбора нескольких элементов для удаления. On ListView scroll Я загружаю больше данных с сервера и уведомляю адаптер. После того, как adapter был уведомлен, режим действия (если он вызван) уничтожается и воссоздается, что делает заголовок и выбранный arraylist пустым (вы можете увидеть рисунок ниже). Пока список элементов списка остается. Я хочу, чтобы CAB был постоянным, как мы видим его в приложении Gmail, где он не уничтожает при загрузке большего количества данных.Android CAB destroying после listview notifydatasetchanged

enter image description here

Ниже приведен код для режима Действие

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

Любая помощь будет высоко оценена, спасибо заранее.

+0

попытаться удалить mode.finish() из itemclick, который может быть предотвращен от воссоздания. –

+0

, пожалуйста, зарегистрируйтесь здесь, поэтому его можно просмотреть. –

+0

@parikdhakan 'mode.finish()' в 'onActionItemClicked' вызывается при нажатии иконки delete в' actionbar', иначе он не будет называться. –

ответ

0

Вы должны сохранить выбранные элементы идентификатор для того, чтобы сохранить состояние и показать, как выбранный после обновления/уведомляют об изменениях адаптера, как показано в примерах ниже:

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

(Это показывает выбор и сохранение выбранные идентификаторы элементов в массиве для сохранения состояния).

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

(Это показывает полный пример вы хотите для удаления только с помощью панели шерлок действий было бы только немного изменить).

Рад узнать, поможет ли это вам.

+0

Выбор не является проблемой, поскольку я упомянул, что элементы остаются выбранными, поэтому я могу их получить. Проблема заключается в том, что при обновлении списка CAB исчезает (иногда дважды), а затем становится видимым. Во время отладки можно легко увидеть, что 'onCreateActionMode' вызывается снова во время обновления списка. Если вы используете Gmail, вы можете увидеть, что CAB не уничтожает и не воссоздается при загрузке большего количества данных. –