2016-10-24 13 views
9

Używam setMultiChoiceModeListener na Listview, aby wywołać tryb działania w celu wybrania wielu elementów do usunięcia. Na przewijanie ListView mogę załadować więcej danych z serwera i powiadomić adapter. Po powiadomieniu adapter, tryb akcji (jeśli został wywołany) jest niszczony i odtwarzany, co powoduje, że tytuł i wybrana lista tablic pustych jest pusta (możesz zobaczyć poniższy obraz). Podczas gdy wybór pozycji listy pozostaje. Chcę, aby CAB była trwała tak, jak to widzimy w aplikacji Gmail, gdzie nie niszczy się podczas ładowania większej ilości danych.Android CAB niszczenie po wyświetleniu listy notifydatasetchanged

enter image description here

Poniżej znajduje się kod dla trybu działania

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

Każda pomoc będzie bardzo mile widziane, z góry dzięki.

+0

spróbuj usunąć tryb.finish() z itemclick, który może nie zostać odtworzony. –

+0

proszę dodać dziennik tutaj, aby go przejrzeć, –

+0

@parikdhakan 'mode.finish()' w 'onActionItemClicked' jest wywoływane po dotknięciu ikony usuwania w' actionbar', w przeciwnym razie nie zostanie tam wywołane. –

Odpowiedz

0

Musisz zapisać wybrane elementy tożsamości w celu utrzymania stanu i pokazać jak wybrany po odświeżeniu/zawiadomić zmiany adaptera jak pokazano na poniższych przykładach:

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

(To pokazuje wybór i oszczędność wybrane elementy id w tablicy, aby zapisać stan).

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

(To pokazuje kompletny przykład chcesz do usunięcia tylko przy użyciu paska działań Sherlock byłoby tylko niewielkie zmiany).

Dobrze wiedzieć, czy to ci pomaga.

+0

Wybór nie jest problemem, ponieważ wspomniałem, że elementy pozostają wybrane, więc mogę je zdobyć. Problem polega na tym, że podczas odświeżania listy CAB znika (czasami dwa razy), a następnie staje się widoczna. Podczas debugowania można łatwo zauważyć, że 'onCreateActionMode' jest wywoływana ponownie podczas odświeżania listy. Jeśli korzystasz z Gmaila, zobaczysz, że CAB nie niszczy i nie tworzy ponownie podczas ładowania większej ilości danych. –

Powiązane problemy