2016-10-24 4 views
9

Ich verwende setMultiChoiceModeListener auf Listview, um den Aktionsmodus für die Auswahl mehrerer Elemente zu löschen. Auf ListView scroll ich mehr Daten vom Server laden und den Adapter benachrichtigen. Nachdem adapter benachrichtigt wurde, wird der Aktionsmodus (falls aufgerufen) zerstört und neu erstellt, wodurch der Titel und die ausgewählte Arraylist leer sind (Sie können das Bild unten sehen). Während die Listview-Elementauswahl bleibt. Ich möchte, dass das CAB beständig bleibt, wie wir es in der Gmail-App sehen, wo es beim Laden von mehr Daten nicht zerstört wird.Android CAB Zerstörung nach Listview notifydatasetchanged

enter image description here

Unten ist der Code für die Aktion Modus

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

Jede Hilfe wird sehr geschätzt, Dank im Voraus.

+0

versuchen Sie, mode.finish() von itemclick zu entfernen, die möglicherweise nicht neu erstellt werden kann. –

+0

Bitte log hier hinzufügen, so können Sie es überprüfen –

+0

@parikdhakan 'mode.finish()' in 'onActionItemClicked' wird beim Antippen des Löschsymbols in' actionbar' aufgerufen, sonst wird es dort nicht aufgerufen. –

Antwort

0

Sie benötigen ausgewählte Artikel-ID zu speichern, um Zustand und zeigen zu halten, wie ausgewählt, nachdem Sie aktualisieren/benachrichtigen Änderungen Adapter wie in folgenden Beispielen gezeigt:

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

(Es zeigt Auswahl und Speichern ausgewählte Artikel-IDs im Array, um den Status zu speichern.

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

(Es zeigt komplettes Beispiel Sie zum Löschen will nur sherlock Aktionsleiste verwenden würde es nur wenig verändert sein).

Gut zu wissen, ob es Ihnen hilft.

+0

Die Auswahl ist kein Problem, da ich erwähnt habe, dass die Elemente ausgewählt bleiben, damit ich sie bekommen kann. Das Problem ist, während die Liste aktualisiert wird, verschwindet die CAB (manchmal zweimal) und dann wird sie sichtbar. Während des Debuggens kann man leicht sehen, dass 'onCreateActionMode' während Listenaktualisierungen erneut aufgerufen wird. Wenn Sie Gmail verwenden, können Sie sehen, dass das CAB beim Laden weiterer Daten nicht zerstört und neu erstellt wird. –

Verwandte Themen