【问题标题】:ArrayIndexOutOfBoundException Error in simple_list_item_checkedsimple_list_item_checked 中的 ArrayIndexOutOfBoundException 错误
【发布时间】:2014-07-06 11:24:10
【问题描述】:

我在 Android 应用程序中创建动态数量的复选框(取决于数组的长度)。我使用 student_array[] 添加了动态数量的复选框。它工作正常。

但我想从此列表中获取选中项的数组。

所以我使用 present_array[] 变量从 simple_list_item_checked 列表中获取已检查项目的列表。

它可以在 toast 中显示 item。但是将此项目添加到 present_array[item] 会显示 ArryIndexOutOfBoundException。

提前感谢您的帮助..

这是我的 java 文件

public class Tab1 extends Activity {
String [] student_array={"party","sport","music","café","education"};
String [] present_array;
/** Called when the activity is first created. */
  ArrayList<String> presentlist;
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.tab1);
      ArrayAdapter<String> adapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, student_array);
      final ListView lv= (ListView)findViewById(R.id.listView1);
      lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
      lv.setAdapter(adapter);


      lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            int len = lv.getCount();
            SparseBooleanArray checked = lv.getCheckedItemPositions();
            for (int i = 0; i < len; i++)
             if (checked.get(i)) {
          String item =(String) lv.getItemAtPosition(checked.keyAt(i));

         present_array[i]=item;  // ERROR WHEN ADDING STRING ARRAY //

             }          
        }
    });


      }  

我的 LogCat

 07-06 06:26:49.329: E/AndroidRuntime(1328): FATAL EXCEPTION: main
 07-06 06:26:49.329: E/AndroidRuntime(1328): Process: info.androidhive.slidingmenu,    PID: 1328

 07-06 06:26:49.329: E/AndroidRuntime(1328): java.lang.ArrayIndexOutOfBoundsException: length=1; index=3
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at    android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176)
  07-06 06:26:49.329: E/AndroidRuntime(1328):   at com.androidexample.tabbar.Tab1$1.onItemClick(Tab1.java:45)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.widget.AdapterView.performItemClick(AdapterView.java:299)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.widget.AbsListView$3.run(AbsListView.java:3638)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.os.Handler.handleCallback(Handler.java:733)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.os.Handler.dispatchMessage(Handler.java:95)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.os.Looper.loop(Looper.java:137)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at android.app.ActivityThread.main(ActivityThread.java:4998)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at java.lang.reflect.Method.invokeNative(Native Method)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at java.lang.reflect.Method.invoke(Method.java:515)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
 07-06 06:26:49.329: E/AndroidRuntime(1328):    at dalvik.system.NativeStart.main(Native Method)

}

【问题讨论】:

    标签: android android-listview indexoutofboundsexception


    【解决方案1】:

    请改用ArrayList。它不需要有固定的大小,每次添加或删除项目时都会改变。

    如下实例化一个空数组列表:

    ArrayList<String> presentlist = new ArrayList<String>();
    

    然后在onItemClick() 中使用add()

    presentlist.add(item)
    

    [编辑]: 并使用以下循环获取列表中所有选中项目的列表:

    for (int i = 0; i<checked.size(); i++){
        if(checked.valueAt(i) == false) continue;
        String item =(String) lv.getItemAtPosition(checked.keyAt(i));
        presentlist.add(item);
    }
    

    【讨论】:

    • 我添加了上面的代码仍然有错误。我的 logcat 在你的代码之后,07-06 07:49:25.629: E/AndroidRuntime(1691): java.lang.ArrayIndexOutOfBoundsException: length=1; index=2 07-06 07:49:25.629: E/AndroidRuntime(1691): 在 android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176) 07-06 07:49:25.629: E/AndroidRuntime(1691):在 com.androidexample.tabbar.Tab1$1.onItemClick(Tab1.java:46) 07-06 07:49:25.629: E/AndroidRuntime(1691): 在 android.widget.AdapterView.performItemClick(AdapterView.java:299)
    • 使用 len = lv.getCheckedItemCount();而不是 lv.getCount()
    • 感谢您添加代码。但是检索此列表时出现错误。我使用以下代码 for(String s:presentlist){ Log.d("retrive list",s); }
    • 使用 - for(int i=0;i&lt;presentlist.size();i++){Log.d("tag",presentlist.get(i));} 或者可以使用迭代器 - Iterator&lt;String&gt; iterator = presentlist.iterator(); while(iterator.hasNext()){Log.d("tag",iterator.next());}
    • 欢迎您。如果它解决了您的问题,请接受答案。
    【解决方案2】:

    您的字符串数组 String [] present_array; 的长度为 1。 你必须用一个长度来初始化它

      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            int len = lv.getCount();
            SparseBooleanArray checked = lv.getCheckedItemPositions();
            present_array = new String[len]; //added this line
            for (int i = 0; i < len; i++)
             if (checked.get(i)) {
          String item =(String) lv.getItemAtPosition(checked.keyAt(i));
    
         present_array[i]=item;  // ERROR WHEN ADDING STRING ARRAY //
    
             }          
        }
    

    【讨论】:

    • @user3510102 抱歉,答案必须是 len 而不是长度
    • 我也用 len。但它现在仍然显示错误。我的日志猫,07-06 07:49:25.629: E/AndroidRuntime(1691): java.lang.ArrayIndexOutOfBoundsException: length=1; index=2 07-06 07:49:25.629: E/AndroidRuntime(1691): 在 android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176) 07-06 07:49:25.629: E/AndroidRuntime(1691):在 com.androidexample.tabbar.Tab1$1.onItemClick(Tab1.java:46)
    • 但是你在这里得到错误checked.keyAt(i)不是我标记的行?!
    • 所以你必须使用这个:int len = lv.getCheckedItemPositions().size()
    【解决方案3】:

    如果我错了,请纠正我,但您似乎正在循环 ListView 中的所有元素。

    相反,您(可能)想要的是循环来自 getCheckedItemPositions() 的元素。

    你应该把你的代码改成这样:

    public class Tab1 extends Activity {
        String [] student_array={"party","sport","music","café","education"};
        List<String> present_array;
        /** Called when the activity is first created. */
        ArrayList<String> presentlist;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.tab1);
            final ArrayAdapter<String> adapter= new ArrayAdapter<String>(this, android.R.layout.simple_list_item_checked, student_array);
            final ListView lv = (ListView)findViewById(R.id.listView1);
            lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
            lv.setAdapter(adapter);
    
    
            lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                        long arg3) {
                    // TODO Auto-generated method stub
    
                    SparseBooleanArray checked = lv.getCheckedItemPositions();
                    int len = checked.size();
                    for (int i = 0; i < len; i++) {
                        // Check if it's indeed checked
                        if (checked.get(i)) {
                            int idx = checked.keyAt(i);
                            // Add str
                            String item = (String) adapter.getItem(idx);
                            present_array.add(item);  // ERROR WHEN ADDING STRING ARRAY //
                        }
                    }
                }
    
            });
        }
    

    注意我是如何检查被检查数组中的项目是否实际被检查的。那是因为:

    然而,该函数有一个未记录在案的陷阱,即使 您选择一个项目然后取消选择,该项目仍包含在 数组

    以上是Stanley Siu's blog的摘录

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多