java.lang.IndexOutOfBoundsException:索引:1,大小:0

时间:2018-08-27 07:35:37

标签: android android-layout

我有一个应用程序,可以将故事发布在具有视频和图像的轮播中。如果帖子是视频,则它带有声音开/关图标,如Instagram。当我从第一个视频转到第二个或第三个视频并单击声音开/关图标时,我的应用程序崩溃了。

下面是代码段:

ArrayList<String> b_checkSound = new ArrayList<>();
cell_soundoff.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mediaPlayer != null) {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.setVolume(1, 1);
                cell_soundon.setVisibility(View.VISIBLE);
                cell_soundoff.setVisibility(View.GONE);
                if(b_checkSound != null) {
                    b_checkSound.add(position, "true");
                }
            }
        }
    }
});

cell_soundon.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (mediaPlayer != null) {
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.setVolume(0, 0);
                cell_soundoff.setVisibility(View.VISIBLE);
                cell_soundon.setVisibility(View.GONE);
                if (b_checkSound != null && b_checkSound.size() > position) {
                    b_checkSound.remove(position);
                }
            }
        }
    }
});

这是我得到的错误:

08-27 16:27:28.954 27154-27154/com.leadplatform.kfarmers E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.leadplatform.kfarmers, PID: 27154
    java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
        at java.util.ArrayList.add(ArrayList.java:483)
        at com.leadplatform.kfarmers.view.diary.DiaryListFragment$Stroy_imageviewAdapter$1.onClick(DiaryListFragment.java:2887)
        at android.view.View.performClick(View.java:6891)
        at android.view.View$PerformClick.run(View.java:26083)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

5 个答案:

答案 0 :(得分:2)

您的数组似乎为空,并且您尝试使用position = 1在第一个元素之后添加元素。

答案 1 :(得分:1)

您不能将ArrayList用于这种类型的问题,因为您取决于位置,但是不能在空数组的第二个索引上添加内容!

尝试改用HashMap,或者如果您真的喜欢优化和性能,则可以使用位标志和位掩码。

编辑:之所以提出这个建议,是因为我相信您想跟踪适配器中被静音或否的每个单独项目。

答案 2 :(得分:0)

在这种情况下,请尝试使用HashMap,因为数组的大小在您的情况下不是固定的,并且使用此方法,您将不必担心IndexOutOfBoundsException异常:

        HashMap<Integer, String> b_checkSound = new HashMap<>(); //CHANGE HERE map with pos->value  
        cell_soundoff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.setVolume(1, 1);
                        cell_soundon.setVisibility(View.VISIBLE);
                        cell_soundoff.setVisibility(View.GONE);
                        if(b_checkSound != null) {
                            b_checkSound.put(position, "true"); //CHANGE HERE
                        }
                    }
                }
            }
        });
//
        cell_soundon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mediaPlayer != null) {
                    if (mediaPlayer.isPlaying()) {
                        mediaPlayer.setVolume(0, 0);
                        cell_soundoff.setVisibility(View.VISIBLE);
                        cell_soundon.setVisibility(View.GONE);
                        if (b_checkSound != null) {//CHANGE HERE
                            b_checkSound.remove(position);
                        }
                    }
                }
            }
        });

答案 3 :(得分:0)

此变量position在其他地方初始化,我不知道您如何使用和修改它。
您应该知道列表中的索引是从零开始的
第一个项目的位置为0。
如果您不考虑这一事实,则可能会遇到此类错误。

答案 4 :(得分:-1)

当您在b_checkSound中插入true时

if(b_checkSound != null) {
b_checkSound.add(position, "true");
}

但是您的b_checkSound大小为零,因此再添加一张支票:

if(b_checkSound != null) {
   if(b_checkSound.size()==0){
      b_checkSound.add("true");
   }else{
        b_checkSound.add(position, "true");
   }
}