Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.IndexOutOfBoundsException:索引:1,大小:0_Android_Android Layout - Fatal编程技术网

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

Android java.lang.IndexOutOfBoundsException:索引:1,大小:0,android,android-layout,Android,Android Layout,我有一个应用程序,它可以在一个旋转木马中发布故事,其中包含视频和图像。如果帖子是视频,它会有一个声音开/关图标,比如Instagram。当我从第一个视频转到第二个或第三个视频并单击声音开/关图标时,我的应用程序崩溃 下面是代码片段: ArrayList<String> b_checkSound = new ArrayList<>(); cell_soundoff.setOnClickListener(new View.OnClickListener() { @Ov

我有一个应用程序,它可以在一个旋转木马中发布故事,其中包含视频和图像。如果帖子是视频,它会有一个声音开/关图标,比如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);
                }
            }
        }
    }
});

您的数组似乎是空的,您试图使用position=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");
   }
}

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

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


编辑:我提出这一建议是因为我相信您希望跟踪适配器中的每个单独项目是否被禁用。

在这种情况下,请尝试使用哈希映射,因为数组的大小在您的情况下是不固定的,使用它,您将不会担心
indexootfbsoundception
异常:

        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);
                        }
                    }
                }
            }
        });
HashMap b_checkSound=newhashmap()//使用pos->value在此处更改地图
cell\u soundoff.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(mediaPlayer!=null){
if(mediaPlayer.isPlaying()){
mediaPlayer.setVolume(1,1);
cell_soundon.setVisibility(View.visibility);
单元_soundoff.setVisibility(视图已消失);
if(b_checkSound!=null){
b_checkSound.put(位置,“true”);//在此处更改
}
}
}
}
});
//
cell_soundon.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(mediaPlayer!=null){
if(mediaPlayer.isPlaying()){
mediaPlayer.setVolume(0,0);
单元格\u soundoff.setVisibility(视图可见);
cell_soundon.setVisibility(View.GONE);
如果(b_checkSound!=null){//在此处更改
b_检查声音。移除(位置);
}
}
}
}
});

此变量
位置
在别处初始化,我不知道如何使用和修改它
您应该知道列表中的索引是基于零的
因此,第一个项目的位置为0

如果你不考虑这个事实,那么你就可以得到这种类型的错误。add命令没有检查列表的大小。因此,您尝试在列表末尾添加(而不是在末尾)
if position>=list.size()list.add(“true”)else list.add(position,“true”)
-类似的内容
        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);
                        }
                    }
                }
            }
        });