2015-10-14 2 views
0

Я реализую удаление нескольких изображений из Grid-view при нажатии кнопки удаления. Я установил флажок и изображение в Grid-View. Я выбираю несколько флажков на изображениях, которые удаляются, но когда-то мое приложение разбилось и получало исключение java.lang.IndexOutOfBoundsException: Неверный индекс 5, размер 4 в этой строке = data.remove (pos); в флажке нажмите событие. Как решить это.Android: java.lang.IndexOutOfBoundsException: Неверный индекс 5, размер 4

Вот мой код в классе адаптера

final BitmapItems item = data.get(position); 
     //holder.imageTitle.setText(item.getTitle()); 
     holder.image.setImageBitmap(item.getBitmap()); 
      final int pos = position; 
      Log.e("pos ", " = " + pos); 

      holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 
        CheckBox cb = (CheckBox) v; 
        Toast.makeText(getContext(), "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), Toast.LENGTH_LONG).show(); 
        if(cb.isChecked()) 
        { 
         int checked = 1; 
         Log.e("", "" + checked); 
         String path = ((String) f.get(pos)); 
         selectedFile.add(path); 
         Log.e("path ", " = " + path); 
         data.remove(pos); 
        } 
        else 
        { 
         int checked = 0; 
         Log.e("",""+ checked); 
        } 
       } 
      }); 

Вот мой удаление кода кнопки в деятельности

imgDeleteImagesFromGallery = (ImageView)findViewById(R.id.imgDeleteImage); 
     imgDeleteImagesFromGallery.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       gridAdapter.notifyDataSetChanged(); 

       Iterator iterator = selectedFile.iterator(); 
       while (iterator.hasNext()) 
       { 
        gridFilePath = new File(iterator.next().toString()); 
        if(gridFilePath.exists()) 
        { 
         gridFilePath.delete(); 
         Log.e("File deleted","Succesfully !!"); 
        } 
       } 
      } 
     }); 

Здесь Log Cat ошибка

10-14 04:16:02.635 15018-15018/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.tazeen.classnkk, PID: 15018 
    java.lang.IndexOutOfBoundsException: Invalid index 5, size is 4 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
      at java.util.ArrayList.remove(ArrayList.java:403) 
      at com.example.tazeen.classnkk.AddPost$GridView_Adapter$1.onClick(AddPost.java:931) 
      at android.view.View.performClick(View.java:4756) 
      at android.widget.CompoundButton.performClick(CompoundButton.java:125) 
      at android.view.View$PerformClick.run(View.java:19748) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
+2

Попробуйте установить позицию как позиционно-1 – dasjkdj

+0

Ну если размер 4, вы можете» t удалите индекс в 5, но вы уже знаете это. Вероятная причина заключается в том, что пользователь мог бы постучать быстро дважды, а второй вызов - после удаления элемента. Просто добавьте проверку размера массива перед вызовом remove – e4c5

ответ

2

Погрешность вы получаете, потому что размер массива - 4 начала отсчета от (0-4), но индекс начинается с 5 отсчетов (1-5), поэтому используется этот код. Я добавил позиция-1

final BitmapItems item = data.get(position); 
     //holder.imageTitle.setText(item.getTitle()); 
     holder.image.setImageBitmap(item.getBitmap()); 
      final int pos = position; 
      Log.e("pos ", " = " + pos); 

      holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 
        CheckBox cb = (CheckBox) v; 
        Toast.makeText(getContext(), "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), Toast.LENGTH_LONG).show(); 
        if(cb.isChecked()) 
        { 
         int checked = 1; 
         Log.e("", "" + checked); 
         String path = ((String) f.get(pos)); 
         selectedFile.add(path); 
         Log.e("path ", " = " + path); 
         data.remove(pos-1); 
        } 
        else 
        { 
         int checked = 0; 
         Log.e("",""+ checked); 
        } 
       } 
      }); 
+0

Я изменяю свой код, используя data.remove (pos-1); и это также окончательное int pos = position - 1; но когда я проверю 1-ю позицию изображения, он снова сработает приложение и получит ту же ошибку java.lang.ArrayIndexOutOfBoundsException: length = 202; index = -1 – androidTag

+0

Не помещайте оба (pos = position - 1) data.remove (pos-1); положить только данные. удалить (pos-1); то он будет работать – Jagan

+0

Я говорю, что я попробовал обе линии первый раз (pos = position - 1) при получении ошибки, которую я удалил, и второй этот data.remove (pos-1); но все равно получая такую ​​же ошибку в ArrayIndexOutOfBoundsException: length = 202; index = -1, когда я устанавливаю флажок для первого изображения элемента gridview. – androidTag

0

Попробуйте установить позицию как позицию-1, так как его возможно, что позиции Checkbox не начинаются с 0, но в 1.
Это объясняет, почему бы индекс пытается доступ размер массива + 1.
Я считаю, что правильное место, чтобы сделать это было бы на этой линии:

holder.image.setImageBitmap(item.getBitmap()); 
     final int pos = position - 1 ; //here 
     Log.e("pos ", " = " + pos); 
+0

Может кто-нибудь дать мне предложения? – androidTag

+0

@androidTag что вы имеете в виду предложения чувака? вы пробовали это? каков был результат? что еще вы пробовали? – dasjkdj

+0

Я пробовал ваш код. Если 5 изображений находятся в режиме сетки, и когда я выбираю первое изображение, значит, приложение с 0-й позицией будет разбиваться. И я хочу удалить несколько изображений выбора из сетки. – androidTag

Смежные вопросы