1

我有两个数组列表:

ArrayList<String> libraries = new ArrayList<String>(2);
ArrayList<String> styles = new ArrayList<String>(2);

我有 3 个 CheckBox 组件。这三个 CheckBoxes 应该向 ArrayList 中添加或删除字符串,但是当检查jqMobileChk时会发生 IndexOutOfBoundsException。

三个复选框:

jqChk.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if(jqChk.isChecked()){
            libraries.add(0,"<script src=\"http://code.jquery.com/jquery-1.8.2.min.js\"></script>\n");
        }else if(!jqChk.isChecked()){
            libraries.remove(0);
        }
    }
});

jqMobileChk.setOnClickListener(new OnClickListener() {  
    @Override
    public void onClick(View v) {
        if(jqMobileChk.isChecked()){
            libraries.add(1,"<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n");
        }else if(!jqMobileChk.isChecked()){
            libraries.remove(1);
        }
    }
});

jqMobCSS.setOnClickListener(new OnClickListener() {     
    @Override
    public void onClick(View v) {
        if(jqMobCSS.isChecked()){
            styles.add(0,"<link rel=\"stylesheet\" href=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css\" />\n");
        }else if(!jqMobCSS.isChecked()){
            styles.remove(0);
        }
    }
});
4

4 回答 4

4
ArrayList<String> libraries = new ArrayList<String>(2);

容量 2,尺寸 0

   libraries.remove(1);

ofc idnex 超出范围,因为大小为 0

于 2013-03-22T23:20:04.863 回答
4

几个问题:

  • 不要使用具体类型作为类型签名;改用接口,以便您以后可以根据需要切换实现。因此,使用List<String> libraries = ...而不是ArrayList<String> libraries = ....
  • 创建一个Listwith2作为构造函数的参数只会创建一个包含两个元素空间的列表。这并不意味着它包含两个元素。当你这样做时libraries.remove(1),你正在删除甚至不存在的东西。
  • 而不是在这里使用 a List<String>,我认为 aMap<Integer, String>可能会更好:

与其做add(0, "..."),不如做libraries.put(0, "...");。要删除,您可以执行libraries.remove(0). 如果密钥不存在,您将不会得到异常。例如:

jqMobileChk.setOnClickListener(new OnClickListener() {  
    @Override
    public void onClick(View v) {

        if(jqMobileChk.isChecked()) {
            libraryMap.put(0, "<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n");

        } else if(!jqMobileChk.isChecked()) {
            libraryMap.remove(0);
        }
    }
});

此外,使用实际版本号可能更好,而不是仅仅0or ,而不是. 在这种情况下,您可能希望将地图制作成并执行以下操作:11.3.00Map<String, String>

jqMobileChk.setOnClickListener(new OnClickListener() {  
    @Override
    public void onClick(View v) {

        if(jqMobileChk.isChecked()) {

            libraryMap.put("1.3.0","<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n");

        } else if(!jqMobileChk.isChecked()) {
            libraryMap.remove("1.3.0");
        }
    }
});
于 2013-03-22T23:26:49.557 回答
2

ArrayList.add

抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())

中没有元素ArrayList,因此是异常。

您可以使用 aMap代替

Map<String, String> libraries = new HashMap<String, String>();

接着

jqMobileChk.setOnClickListener(new OnClickListener() {  
    @Override
    public void onClick(View v) {
        if (jqMobileChk.isChecked()) {
            libraries.put("jqMobileChk","<script src=\"http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js\"></script>\n");
        } else if (!jqMobileChk.isChecked()) {
            libraries.remove("jqMobileChk");
        }
    }
});
于 2013-03-22T23:27:16.763 回答
1

如果 ArrayList 中没有索引 0,则不能添加到索引 1。

改用“真实”数组或SparseArray - 你可以这样做。

于 2013-03-22T23:20:14.800 回答