0

特定の要素(と呼ばれる)ExpandableListViewに基づいて子ビューを膨らませるウィジェットを使用しています。これは正常に機能しています。ArrayListq

問題は、すべての子ビューの下に、ビューを追加したいということです。これは非常に単純なはずです。アダプタの方法では、関連するのサイズgetChildrenCount()を追加します。次に、このメソッドでは、次の2つのケースでswitch(position)ステートメントを使用します。1ArrayListgetChildView()

  • ArrayList内の各オブジェクトの通常の子ビューを拡張するデフォルトのケース
  • TextViewケース:-1は、下部に配置される特別なビュー(現時点では)を作成します。

ただし、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;
    }
4

2 に答える 2

1

に問題がありcase -1ます。

Androidは、最後のビューが「偽物」であること、つまり実際の要素ではないことを認識していません。実は!childPos_ never_ -1最後の子の場合は次のようになります。

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

また、後で発見する問題があります。

の場合、ケースをカバーしていませんconvertView != null。これは頻繁に発生するため、準備する必要があります。これは、リストアイテムビューがリストビューウィジェットによってリサイクルされる場合です。その場合、新しいアイテムビューを作成するのではなく、その値を設定する必要があります。

于 2013-02-06T04:02:51.233 に答える
0

問題は、要素がこれらの位置で初期化されていないか、q.get(groupPos)またはanswers.get(childPos)要素が初期化されていないためです。

IndexOutOfBoundArrayListある位置にある要素にアクセスしようとしてn、その位置に要素が初期化されていない場合、例外が発生します

于 2013-02-06T04:02:03.777 に答える