我正在使用ExpandableListView
窗口小部件,该窗口小部件根据特定ArrayList
(称为q
)中的元素来扩展子视图。这工作正常。
问题是,在所有子视图下面,我想添加一个额外的视图。看起来这应该很简单:在适配器的getChildrenCount()
方法中,我将1
添加到相关ArrayList
的大小。然后,在getChildView()
方法中,我使用了一个带有两种情况的switch(position)语句:
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;
}
答案 0 :(得分:1)
您遇到case -1
。
Android并不知道你的上一个观点是"假的"即它不是一个实际的元素。实际上,childPos
将never
为-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
异常