我正在实现从网格视图中删除多个图像,点击删除按钮。我已经将复选框和图像视图放在网格视图中,我在图像上选中了多个复选框--这些图像被删除了,但是有时我的应用程序崩溃了,并且得到了java.lang.IndexOutOfBoundsException:无效索引5的例外,在复选框中的为4,在复选框中单击event.How来解决这个问题。
以下是我在Adapter类中的代码
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 !!");
}
}
}
});在这里,日志猫错误
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)发布于 2015-10-14 06:32:55
由于数组大小为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);
}
}
});发布于 2015-10-14 06:33:46
尝试将pos设置为position- 1,因为复选框位置可能不是从0开始,而是从1开始。
这将解释为什么索引试图访问数组大小+ 1。
我认为正确的地方是在这条线上:
holder.image.setImageBitmap(item.getBitmap());
final int pos = position - 1 ; //here
Log.e("pos ", " = " + pos);https://stackoverflow.com/questions/33118055
复制相似问题