簡體   English   中英

ArrayIndexOutOfBoundsException /從alertdialog向活動傳遞arraylist

[英]ArrayIndexOutOfBoundsException / passing arraylist from alertdialog to activity

我有一個具有多個選擇的Alertdialog,我將用戶的選擇存儲在字符串的ArrayList上,並且我想將存儲的arraylist傳遞給主機活動(我將使用數組的元素來查詢數據庫)。

當我運行我的應用程序時,我得到了ArrayIndexOutOfBoundsException(可能是索引是-1 ..),我不確定是不是循環,或者我是否沒有從alertdialog中正確傳遞arraylist ...

你們可以看看嗎? 這是我的功能:

    public void onOkay(ArrayList<String> selected) {
    StringBuilder stringBuilder = new StringBuilder();
    if (selected.size() != 0) {
        for (int i = 0; i < selected.size(); i++) {
            String categories = selected_items_array[selected.indexOf(i)];
            stringBuilder = stringBuilder.append(" " + categories);
        }
        Toast.makeText(this, "You have selected: "
                + stringBuilder.toString(), Toast.LENGTH_SHORT).show();
    }

}

logcat:

java.lang.ArrayIndexOutOfBoundsException: length=6; index=-1
        at com.hichamridouane.smartshop.MainActivity.onOkay(MainActivity.java:164)
        at com.hichamridouane.smartshop.TimelineSettings$2.onClick(TimelineSettings.java:71)

是我的dialogfragment類。 是我的主機活動。(正如我所說,我不確定我是否將arraylist正確傳遞給主機活動)謝謝!

這對我來說真的很奇怪,尤其是在

String categories = selected_items_array[selected.indexOf(i)];

來自JavaDocs關於indexOf

Returns the index of the first occurrence of the specified element
in this list, or -1 if this list does not contain the element.
More formally, returns the lowest index <tt>i</tt> such that
<tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
or -1 if there is no such index.

因此,您嘗試在第一次迭代i == 0時selected_items_array中找到元素(Java中名稱不正確), selected_items_array沒有這樣的元素=> indexOf return -1 數組不能具有索引= -1的元素,它從0開始。因此,您有了ArrayIndexOutOfBoundsException

問題解決了。 我必須在我的活動和dialogfragment中使用整數數組列表。

這是我在DialogFragment類中所做的DialogFragment

public class TimelineSettings extends DialogFragment {
ArrayList<Integer> selected_categories = new ArrayList<Integer>();
boolean[] itemsChecked = {false, false, false, false, false, false};


// this interface to communicate with the host activity.

public interface dialoglistener {
    public void onOkay(ArrayList<Integer> selected);
    public void onCancel();
}
dialoglistener mlistener;


//this function is to instantiate the dialoglistener

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mlistener = (dialoglistener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement dialogListener");
    }
}

我的選擇對話框:

    @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    for(int i=0;i<itemsChecked.length;i++){
        if(selected_categories.contains((String)String.valueOf(i)))
            itemsChecked[i]=true;
    }

    // Set the dialog title
    builder.setTitle("Choisissez vos paramètres")
            .setMultiChoiceItems(R.array.categories, itemsChecked,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int indexselected,
                                            boolean isChecked) {
                            if (isChecked) {
                                // If the user checked the item, add it to the selected items
                                if(!selected_categories.contains(indexselected)){
                                    selected_categories.add(indexselected);
                                    itemsChecked[indexselected]=true;
                                }
                            } else if (selected_categories.contains(indexselected)) {
                                // Else, if the item is already in the array, remove it
                                selected_categories.remove(indexselected);
                                itemsChecked[indexselected]=false;
                            }
                        }
                    })
                    // Set the action buttons
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    mlistener.onOkay(selected_categories);
                }
            })
            .setNegativeButton("Annuler", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    mlistener.onCancel();
                }
            });
    return builder.create();
}

在主機活動中,我實現了片段的接口:

    @Override
public void onCreate(Bundle savedInstanceState) {
    /* some fancy stuff */
    Resources res = getResources();
    selectedArray = res.getStringArray(R.array.categories);
}

獲取選定的項目(並在烤面包上展示它們,僅用於測試):

    @Override
public void onOkay(ArrayList<Integer> selected) {
    StringBuilder stringBuilder = new StringBuilder();
    if (selected.size() != 0) {
        for (int i = 0; i < selected.size(); i++) {
            String categories = selectedArray[selected.get(i)];
            stringBuilder = stringBuilder.append(" " + categories);
        }
        Toast.makeText(this, "You have selected: "
                + stringBuilder.toString(), Toast.LENGTH_SHORT).show();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM