首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android : java.lang.IndexOutOfBoundsException:无效索引5,大小为4

Android : java.lang.IndexOutOfBoundsException:无效索引5,大小为4
EN

Stack Overflow用户
提问于 2015-10-14 06:25:39
回答 2查看 5.5K关注 0票数 0

我正在实现从网格视图中删除多个图像,点击删除按钮。我已经将复选框和图像视图放在网格视图中,我在图像上选中了多个复选框--这些图像被删除了,但是有时我的应用程序崩溃了,并且得到了java.lang.IndexOutOfBoundsException:无效索引5的例外,在复选框中的为4,在复选框中单击event.How来解决这个问题。

以下是我在Adapter类中的代码

代码语言:javascript
复制
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);
                    }
                }
            });

这是我在活动中的删除按钮代码

代码语言:javascript
复制
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 !!");
                    }
                }
            }
        });

在这里,日志猫错误

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2015-10-14 06:32:55

由于数组大小为4计数,从(0-4)开始,而索引为5计数,则从(1-5)开始,因此使用了以下代码。我增加了一个职位-1

代码语言:javascript
复制
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);
                    }
                }
            });
票数 2
EN

Stack Overflow用户

发布于 2015-10-14 06:33:46

尝试将pos设置为position- 1,因为复选框位置可能不是从0开始,而是从1开始。

这将解释为什么索引试图访问数组大小+ 1。

我认为正确的地方是在这条线上:

代码语言:javascript
复制
holder.image.setImageBitmap(item.getBitmap());
        final int pos = position - 1 ; //here
        Log.e("pos ", " = " + pos);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33118055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档