簡體   English   中英

刪除元素后的Arraylist IndexOutOfBoundsException

[英]Arraylist IndexOutOfBoundsException after removing element

我知道這是一個愚蠢的問題,但我已經花了1.5小時查看代碼並沒有找到任何東西:

holder.removeQuestion
                    .setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            // Button b = (Button) v;
                            // Question question = (Question) b.getTag();
                            Log.i("before removing", questionList.get(0)
                                    .getQuestion());
                            questionList.remove(0);
                            dataAdapter.notifyDataSetChanged();
                            Log.i("after removing", questionList.get(0)
                                    .getQuestion());
                        }
                    });

行: questionList.remove(0)是問題,但為什么? 列表中充滿了元素,我只是想刪除第一個元素,它怎么能被outofbound? 我想,也許它會在我再次使用列表的代碼中發生,也許我說某個地方我希望比我實際給出的更多的arraylist。

07-07 13:24:08.005: I/before removing(16695): Ako?
07-07 13:24:08.005: I/after removing(16695): Sa?
07-07 13:24:08.009: V/ConvertView(16695): 0
07-07 13:24:08.009: V/ConvertView(16695): 1
07-07 13:24:08.013: V/ConvertView(16695): 2
07-07 13:24:08.017: D/AndroidRuntime(16695): Shutting down VM
07-07 13:24:08.017: W/dalvikvm(16695): threadid=1: thread exiting with uncaught     
exception (group=0xa62b1288)
07-07 13:24:08.021: E/AndroidRuntime(16695): FATAL EXCEPTION: main
07-07 13:24:08.021: E/AndroidRuntime(16695): java.lang.IndexOutOfBoundsException:     
Invalid index 2, size is 2
07-07 13:24:08.021: E/AndroidRuntime(16695):    at     
java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
07-07 13:24:08.021: E/AndroidRuntime(16695):    at 
java.util.ArrayList.get(ArrayList.java:304)
07-07 13:24:08.021: E/AndroidRuntime(16695):    at 
com.example.discue.Discussion$MyCustomAdapter.getView

如果你還需要進一步的代碼,我會添加評論。 我不想打擾你。

編輯(onView方法):

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Log.v("ConvertView", String.valueOf(position));

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) 
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.question_list, null);

            holder = new ViewHolder();
            holder.question = (TextView) convertView
                    .findViewById(R.id.question);
            holder.checkBox = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);
            holder.likes = (TextView) convertView
                    .findViewById(R.id.numberOfLikes);
            // create button for deleting question (for speaker)
            holder.removeQuestion = (Button) convertView
                    .findViewById(R.id.deleteQuestionBtn);
            convertView.setTag(holder);
            // set onclick listener on remove question button
            holder.removeQuestion
                    .setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            // Button b = (Button) v;
                            // Question question = (Question) b.getTag();
                            Log.i("before removing", questionList.get(0)
                                    .getQuestion());
                            questionList.remove(0);
                            dataAdapter.notifyDataSetChanged();
                            Log.i("after removing", questionList.get(0)
                                    .getQuestion());
                        }
                    });
            // set onclick listener on like check box for question
            holder.checkBox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    Question question = (Question) cb.getTag();
                    if (cb.isChecked()) {
                        // update number of likes under like button
                        question.setLikes(question.getLikes() + 1);

                    } else {
                        question.setLikes(question.getLikes() - 1);
                    }

                    // resort the arraylist of questions
                    Collections.sort(questionList,
                            new Comparator<Question>() {
                                public int compare(Question q1, Question q2) {
                                    return (q2.getLikes() - q1.getLikes());
                                }
                            });
                    // execute the update
                    dataAdapter.notifyDataSetChanged();

                    question.setSelected(cb.isChecked());
                }
            });
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Question question = questionList.get(position);
        // show/hide question remove button (for the first question)
        if (question.isRemoveButtonVisible()) {
            holder.removeQuestion.setVisibility(View.VISIBLE);
        } else {
            holder.removeQuestion.setVisibility(View.GONE);
        }
        // show/ hide question likes
        if (question.isLikeButtonVisible()) {
            holder.checkBox.setVisibility(View.VISIBLE);
        } else {
            holder.checkBox.setVisibility(View.GONE);
        }
        // set checked/unchecked and disabled/not disabled like check boxes
        // (all except for the first question)
        if (question.isLikeDisabled()) {
            holder.checkBox.setChecked(true);
            holder.checkBox.setEnabled(false);
        } else {
            holder.checkBox.setChecked(question.isSelected());
            holder.checkBox.setEnabled(true);

        }
        holder.question.setText(question.getQuestion());
        holder.likes.setText(question.getLikes() + "");
        holder.checkBox.setTag(question);
        holder.removeQuestion.setTag(question);
        dataAdapter.notifyDataSetChanged();
        return convertView;

    }

這里發生錯誤:

Question question = questionList.get(position);

position2 ,超出界限。 您可能希望先檢查或阻止該方法獲取等於或大於questionList大小的position值。 看來你的UI列表中的項目比questionList有問題的項目多

在getView中給你的位置應該考慮數據的大小。

我的猜測是,當你創建適配器時,你給它一個特定的列表(問題列表),但在稍后的某個時候,你在本地創建一個新的列表實例並在不更新適配器的情況下修改它。

確保對列表所做的任何更改都在同一個列表實例上,並且不會創建新的列表實例。

暫無
暫無

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

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