1

2つのArrayListがあります。

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

3つのチェックボックスコンポーネントがあります。3つのチェックボックスはArrayListに文字列を追加または削除することになっていますが、jqMobileChkをチェックすると、IndexOutOfBoundsExceptionが発生します。

3つのチェックボックス:

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);

サイズが0であるため、ofcidnexが範囲外です

于 2013-03-22T23:20:04.863 に答える
4

いくつかの問題:

  • 型シグネチャとして具象型を使用しないでください。代わりにインターフェースを使用して、必要に応じて後で実装を切り替えることができるようにします。したがって、List<String> libraries = ...の代わりに使用してArrayList<String> libraries = ...ください。
  • コンストラクターへの引数としてListwithを作成すると、2つの要素のための余地のあるリストのみが作成されます。2つの要素が含まれているという意味ではありません。そうすると、存在すらしていないものを削除することになります。2libraries.remove(1)
  • ここを使用する代わりに、私はより良いかもしれないとList<String>思います:Map<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);
        }
    }
});

また、またはの代わりに01実際のバージョン番号を使用する方がよい場合があります。したがって、1.3.0の代わりに0。この場合、マップを作成Map<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ため、例外です。

Map代わりに使用できます

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 に答える