2014-06-24 4 views
0

J'ai une chaîne de tableau que je l'ai utilisé dans mon Fragment, et je montre les éléments de chaîne de tableau avec setListAdapter dans ma liste:comment supprimer les éléments de liste sélectionnés?

public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
String[] array = getResources().getStringArray(R.array.examlearray); 
     final ArrayList<String> str = new ArrayList<String>(Arrays.asList(array)); 
     final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, str); 
     setListAdapter(arrayAdapter); 

    final ListView listView = getListView();  
     listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {... 

et sous mon onActionItemClicked je veux mettre en œuvre mon deleteSelectedItem() méthode, que supprimer des éléments de ma liste sélectionnée, et ceci est mon code, mais il n'a pas supprimé l'élément sélectionné, il est juste retiré du premier de la liste, et où jamais il veut !!! que dois-je faire?, Toute aide serait être apprécié! Merci!

@Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       // Respond to clicks on the actions in the CAB 
       switch (item.getItemId()) { 
        case R.id.delete: 
        // deleteSelectedItems(); 

         Log.i(TAG, "deleteSelectedEntries"); 
         SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 
         for(int i=0;i<checkedItems.size();++i){ 

         if(checkedItems.valueAt(i)){ 
          str.remove(listView.getItemAtPosition(i)); 
         } 
         } 

         arrayAdapter.notifyDataSetChanged(); 

         mode.finish(); 
         return true; 
         } 
+0

avez-vous sélectionné correctement obtenir un objet? avez-vous vérifié les valeurs 'onActionItemClicked' et' checkedItems'? –

+0

Il semble que votre logique est erronée! –

+0

@PareshMayani pourquoi et où? –

Répondre

0

votre code dans de nombreux cas sont revenus ArrayIndexOutOfBound.

un exemple:

vous avez une liste avec l'élément 14, vous sélectionnez d'abord et dernier indice sur elle. dans ce scénario, vous supprimez le premier index de votre liste, la taille de votre liste est alors de 13, puis pour supprimer le dernier élément auquel vous essayez d'accéder, le 14ème élément de votre liste qui existe pas

Comment résoudre:

for(int i=checkedItems.size()-1 ;i>= 0;i--){ 

     if(checkedItems.valueAt(i)){ 
      str.remove(checkedItems.keyAt(i)); 
     } 
} 
+0

J'essaye votre code, avec cette ligne pour (int i = checkedItems.size(); i> 0 ; i--) mon application supprime d'abord le plantage, et je l'ai vérifié en changeant le tableau à ce que vous avez suggéré, mais il fera la même chose, il supprimera seulement le dernier élément sélectionné correctement, et au lieu d'autres supprimer tout Je ne sais pas pourquoi! Avez-vous une autre suggestion? –

+0

voir mon edit @Ladan –

+0

merci beaucoup, ça marche bien! merci;): D –

0

dans votre code, vous supprimez de la str ArrayList finale (pourquoi la déclarer finale si vous envisagez de supprimer/données de changement?) Qui est présent dans votre activité.

vous devez utiliser

arrayAdapter.remove(listView.getItemAtPosition(i)) 

puis

arrayAdapter.notifyDataSetChanged(); 
+0

se référer http://developer.android.com/reference/android/widget/ArrayAdapter.html pour les méthodes. Si vous utilisez une implémentation intégrée de n'importe quelle classe utilisez TOUJOURS les méthodes qu'il fournit .. ou utilisez votre implémentation personnalisée – Droidekas

1

la clé du SparseBooleanArray indique la position de l'élément sélectionné dans le listview. Ainsi, au lieu de str.remove(listView.getItemAtPosition(i)); utiliser str.remove(checkedItems.keyAt(i));

@Override 
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    // Respond to clicks on the actions in the CAB 
    switch (item.getItemId()) { 
     case R.id.delete: 
      // deleteSelectedItems(); 

      Log.i(TAG, "deleteSelectedEntries"); 
      SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 
      for(int i=0;i<checkedItems.size();++i){ 

      if(checkedItems.valueAt(i)){ 
       str.remove(checkedItems.keyAt(i)); 
      } 
    } 

    arrayAdapter.notifyDataSetChanged(); 

    mode.finish(); 
    return true; 
} 
+0

merci beaucoup, ça marche, mais quand je sélectionne tous les éléments de mon application plantage! Pourquoi? –

+0

poster le message de logcat – SathMK

+0

oh c'est juste de travailler bien quand je sélectionne un élément, mais quand je sélectionne plus d'un élément, il va planter –

Questions connexes