1

I create dynamical number of checkboxes (it depends on the length of array) in an Android app. I added dynamic number of checkboxes using student_array[].It works fine.

But I want to get the array of checked items from this list.

So I use present_array[] varible for get list of checked items from simple_list_item_checked list.

It works in toast for showing item.But adding this item to present_array[item] showing the ArryIndexOutOfBoundException.

Advance thanks for your help..

This is my java file

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 //

             }          
        }
    });


      }  

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

}

3 Answers 3

1

Use the ArrayList instead. It does not need to have a fixed size and will change every time you add or remove an item.

Instantiate an empty array list as below :

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

Then use add() in onItemClick() :

presentlist.add(item)

[EDIT] : And use the below loop to get the list of all checked items in the list :

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);
}
Sign up to request clarification or add additional context in comments.

5 Comments

I added above code still i have error. my logcat after your code, 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): at android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176) 07-06 07:49:25.629: E/AndroidRuntime(1691): at com.androidexample.tabbar.Tab1$1.onItemClick(Tab1.java:46) 07-06 07:49:25.629: E/AndroidRuntime(1691): at android.widget.AdapterView.performItemClick(AdapterView.java:299)
use len = lv.getCheckedItemCount(); instead of lv.getCount()
thanks for Your code work for adding. But retriving this list I got error.I use below code, for(String s:presentlist){ Log.d("retrive list",s); }
use - for(int i=0;i<presentlist.size();i++){Log.d("tag",presentlist.get(i));} or can use an iterator - Iterator<String> iterator = presentlist.iterator(); while(iterator.hasNext()){Log.d("tag",iterator.next());}
Your welcome. Please do accept the answer if it solves your problem.
1

Your String array String [] present_array; has a length of 1. You have to initilaze it with a length

  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 //

         }          
    }

4 Comments

@user3510102 sorry change the answer must be len not length
I use len also. But it shows error still now. my 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): at android.util.SparseBooleanArray.keyAt(SparseBooleanArray.java:176) 07-06 07:49:25.629: E/AndroidRuntime(1691): at com.androidexample.tabbar.Tab1$1.onItemClick(Tab1.java:46)
But you get the error here checked.keyAt(i) not i the marked line?!
So you have to use this: int len = lv.getCheckedItemPositions().size()
1

Correct me if i'm wrong but it seems that you are looping all the elements from the ListView.

Instead what you (probably) wanted is to loop the elements from getCheckedItemPositions().

You should change your code to this:

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 //
                    }
                }
            }

        });
    }

Note how i am checking if the item inside the checked array is actually checked. That's because:

The function however has a trap that is not documented, is that even you select one item and then deselect, the item is still included in the array

Above is an extract from Stanley Siu's blog

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.