redRabbit
redRabbit

Reputation: 79

Java.lang.ArrayIndexOutOfBoundException - AlertDialog

I'm trying to build an app where if user click a button, it will shows an alertdialog with multiChoiceItems,

I assigned the value of the option in multiChoiceItems from an ArrayList (which has been converted to arrayed string), but when I tried to click the button, the program is error instead of showing the dialog with the options,

It throws a java.lang.ArrayIndexOutOfBoundException exception, but I don't know where is the error and how I should fixed it.

Here is my piece of code and Logcat :

    @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_todolist);
    sessionAndDeclaration();
    getActionBar().setDisplayShowHomeEnabled(false);
    new AttemptGetReceiver().execute();
}

class AttemptGetReceiver extends AsyncTask<Void, Void, Boolean> {
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pd = new ProgressDialog(CreateToDoList.this);
        pd.setMessage("Loading...");
        pd.setIndeterminate(false);
        pd.show();
        pd.setCancelable(true);
    }

    // will get group member from selected group id to be receiver
    @Override
    protected Boolean doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        int success = 0;
        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("GroupId", groupId));

            JSONObject json = jsonParser.makeHttpRequest(url, "POST",
                    params);
            success = json.getInt("success");
            if (success == 1) {
                Log.d("Success", "Getting parsed data");
                mMember = json.getJSONArray("members");

                try {
                    for (int i = 0; i < mMember.length(); i++) {
                        JSONObject c = mMember.getJSONObject(i);
                        String parsedMember = c.getString("Username");
                        mMemberList.add(parsedMember);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

        } catch (JSONException e) {

        }

        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        pd.dismiss();

    }

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {

    case R.id.bChooseReceiver:
        alertDialogListReceiver();
        break;

}

public void alertDialogListReceiver() {
    // TODO Auto-generated method stub
    stringList.clear();
    final String[] listMember = new String[mMemberList.size()];
    final boolean[] itemsChecked = new boolean[mMemberList.size()];
    for (int i = 0; i < mMemberList.size(); i++) {
        listMember[i] = mMemberList.get(i);
    }

    stringList.clear();

    AlertDialog.Builder builder = new AlertDialog.Builder(
            CreateToDoList.this);

    builder.setTitle("Choose Your Receiver : ");

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            xmlListReceiver.setText("Post To : ");

            for (int i = 0; i < listMember.length; i++) {
                if (itemsChecked[i]) {
                    stringList.add(listMember[i]);
                    itemsChecked[i] = false;
                }

                Log.d("flag", "after for");

            }
            String string = "";
            for (int i = 0; i < stringList.size(); i++) {
                xmlListReceiver.setText("Send To : ");
                string = string + " " + stringList.get(i);

            }
            xmlListReceiver.setText(xmlListReceiver.getText().toString()
                    + string);
        }
    });
    builder.setMultiChoiceItems(listMember, new boolean[] { false, false,
            false }, new DialogInterface.OnMultiChoiceClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which,
                boolean isChecked) {
            itemsChecked[which] = isChecked;
        }
    });
    builder.show();
    Log.d("flag", "bottom of alert dialog");
}
}

Logcat :

02-01 22:23:40.866: E/AndroidRuntime(28969): FATAL EXCEPTION: main
02-01 22:23:40.866: E/AndroidRuntime(28969): Process: com.thesis.teamizer, PID: 28969
02-01 22:23:40.866: E/AndroidRuntime(28969): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
02-01 22:23:40.866: E/AndroidRuntime(28969):    at com.android.internal.app.AlertController$AlertParams$1.getView(AlertController.java:894)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.AbsListView.obtainView(AbsListView.java:2712)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.ListView.measureHeightOfChildren(ListView.java:1274)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.ListView.onMeasure(ListView.java:1186)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5363)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2548)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.View.measure(View.java:17495)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2285)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1371)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1595)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6637)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:814)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.Choreographer.doCallbacks(Choreographer.java:614)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.Choreographer.doFrame(Choreographer.java:584)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:800)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.os.Handler.handleCallback(Handler.java:733)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.os.Looper.loop(Looper.java:146)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at android.app.ActivityThread.main(ActivityThread.java:5602)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at java.lang.reflect.Method.invokeNative(Native Method)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at java.lang.reflect.Method.invoke(Method.java:515)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
02-01 22:23:40.866: E/AndroidRuntime(28969):    at dalvik.system.NativeStart.main(Native Method)

Upvotes: 3

Views: 423

Answers (1)

user180100
user180100

Reputation:

I think the problem is that you set default item state (checked or not) here:

builder.setMultiChoiceItems(listMember, new boolean[] { false, false,
        false }, new DialogInterface.OnMultiChoiceClickListener() {

for 3 items, but you can have a different number of item: mMemberList.size(), from the javadoc:

checkedItems specifies which items are checked. It should be null in which case no items are checked. If non null it must be exactly the same length as the array of items.

Using null for checkedItems should fix the issue:

builder.setMultiChoiceItems(listMember, null, new DialogInterface.OnMultiChoiceClickListener() {

Upvotes: 3

Related Questions