ExpandableListView小部件上的IndexOutOfBounds异常

时间:2013-02-06 03:44:03

标签: android widget

我正在使用ExpandableListView窗口小部件,该窗口小部件根据特定ArrayList(称为q)中的元素来扩展子视图。这工作正常。

问题是,在所有子视图下面,我想添加一个额外的视图。看起来这应该很简单:在适配器的getChildrenCount()方法中,我将1添加到相关ArrayList的大小。然后,在getChildView()方法中,我使用了一个带有两种情况的switch(position)语句:

  • 默认情况,为ArrayList
  • 中的每个对象的常规子视图进行通胀
  • 一个案例:-1,它创建了特殊视图(目前我只是使用TextView),放在底部。

但是,我在适配器上收到IndexOutOfBounds错误,可能是因为我没有正确编码getChildrenCount()和/或getChildView()方法的更改。我怀疑它正在寻找另一个数组元素(不存在),而不是将特殊视图作为最后一个孩子。

以下是适配器的getChildView()getChildrenCount()方法的代码。如果您需要查看适配器的完整代码,请告诉我。

@Override
public View getChildView(int groupPos, int childPos, boolean arg2, View convertView,
        ViewGroup arg4) {
    if (convertView == null) {
        switch (childPos) {
        case -1:
            TextView post = new TextView(null);
            post.setText("post an answer");
            post.setTextColor(Color.BLUE);
            convertView = post;
            break;
        default:
            convertView = getLayoutInflater().inflate(R.layout.answerbox, null);
        }

        TextView ansText = (TextView)convertView.findViewById(R.id.answerText);
        TextView ansAuthor = (TextView)convertView.findViewById(R.id.answerAuthor);
        TextView ansUV = (TextView)convertView.findViewById(R.id.answerUpvotes);

        ansText.setText(q.get(groupPos).answers.get(childPos).text);
        ansAuthor.setText(q.get(groupPos).answers.get(childPos).author);
        ansUV.setText(Integer.toString(R.id.answerUpvotes));
    }
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return q.get(groupPosition).answers.size() + 1;
}

在以下行引发IndexOutOfBounds错误:

ansText.setText(q.get(groupPos).answers.get(childPos).text);

更新的代码(现在正在运行):

        @Override
    public View getChildView(int groupPos, int childPos, boolean arg2, View convertView,
            ViewGroup arg4) {
        if (convertView == null){
        //switch (childPos){
        if (childPos == q.get(groupPos).answers.size()){
            convertView = getLayoutInflater().inflate(R.layout.answerbox, null);            

            TextView ansText = (TextView)convertView.findViewById(R.id.answerText);
            TextView ansAuthor = (TextView)convertView.findViewById(R.id.answerAuthor);
            TextView ansUV = (TextView)convertView.findViewById(R.id.answerUpvotes);

            ansText.setText("POST NEW");                    
            ansUV.setText(Integer.toString(R.id.answerUpvotes));
        }
        else{
        convertView = getLayoutInflater().inflate(R.layout.answerbox, null);            

        TextView ansText = (TextView)convertView.findViewById(R.id.answerText);
        TextView ansAuthor = (TextView)convertView.findViewById(R.id.answerAuthor);
        TextView ansUV = (TextView)convertView.findViewById(R.id.answerUpvotes);

        ansText.setText(q.get(groupPos).answers.get(childPos).text);
        ansAuthor.setText("by " + q.get(groupPos).answers.get(childPos).author);                    
        ansUV.setText(Integer.toString(R.id.answerUpvotes));
        }
        }
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return q.get(groupPosition).answers.size()+1;
    }

2 个答案:

答案 0 :(得分:1)

您遇到case -1

的问题

Android并不知道你的上一个观点是"假的"即它不是一个实际的元素。实际上,childPosnever-1!你最后一个孩子的情况应该是:

if (childPos == q.get(groupPos).answers.size()) {
    // last view
} else {
    // regular view
}

您还有一个问题,您稍后会发现:

convertView != null时你还没有涉及此案。这将经常发生,你应该为此做好准备。列表视图小部件回收列表项视图时就是这种情况。在这种情况下,您应该设置它的值,而不是创建新的项目视图。

答案 1 :(得分:0)

问题出在q.get(groupPos)answers.get(childPos),因为元素尚未在这些位置初始化

当您尝试访问位置IndexOutOfBound的{​​{1}}中的元素且未在该位置初始化元素时,会引发

ArrayList异常