0

BaseExpandableListAdapterを使用してカスタムビューをグループビューに追加したい

これはコードです:

カスタムビューとlayout.xml

public class InfoView extends View{
    private EditText nameEditText;
    private EditText descriptionEditText;
    private Spinner goalTypeSpinner;
    private Spinner categorySpinner;



    Button addGoalCategoryButton;
    public InfoView(Context context) {
        super(context);
        inflate(context, R.layout.info_panel, parent);
        nameEditText = (EditText) findViewById(R.id.nameEditText);

        descriptionEditText = (EditText) findViewById(R.id.descriptionEditText);

        goalTypeSpinner = (Spinner) 
                findViewById(R.id.goalTypeSpinner);

        categorySpinner = (Spinner) 
                findViewById(R.id.categorySpinner);
    }
}

infopanel.xml

<LinearLayout 
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" >
    <Spinner android:id="@+id/goalTypeSpinner" android:prompt="@string/goalType"
            android:entries="@array/goalTypeList" style="@style/commonText.commonSpinner" >
    </Spinner>
    <TableRow style="@style/commonText.commonTableRow">

            <Spinner android:id="@+id/categorySpinner" style="@style/commonText.commonSpinner.right"
                android:prompt="@string/goalType">
            </Spinner>
            <Button android:id="@+id/newCategoryButton" style="@style/commonText.commonButton"
                android:text="add category" />
    </TableRow> 
    <EditText android:id="@+id/nameEditText" android:hint="@string/nameEditTextHint"
        style="@style/commonText.commonEditText" >
    </EditText>
    <EditText android:id="@+id/descriptionEditText" android:hint="@string/descriptionEditTextHint"
        style="@style/commonText.commonTextArea">
    </EditText>

</LinearLayout>

BaseExpandableListAdapter内:

..............
InfoView infoView;
public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {

        if (group.equals(INFO) && child.equals(INFO)) {
            Log.i(TAG, "group INFO(" + group + ")");

            if (infoView == null) {

                // i don't want to recreate everytime 
                // the view so i check if is null         

                infoView = new InfoView(context);
            }

            return infoView;
        }
........

コードは機能しますが(つまり、例外はスローされません)、ビューは表示されません。

なぜなのかご存知ですか ?

ありがとう、よろしく

4

2 に答える 2

0

getChildViewを実装する適切な方法は、提供されているconvertViewを使用することです。getChildViewで作成されたビューの参照を保持しないでください。

public View getChildView(int groupPosition, int childPosition,
                        boolean isLastChild, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new InfoView(context);
    }
    return convertView;
}
于 2011-02-16T01:43:04.690 に答える
0

あなたが投稿したコードには多くの欠落があります: infopanel.xml はどこで使用されていますか? InfoView の子ビューにどのようにデータを入力しますか? 等。

しかし、投稿した内容からすると、複合コントロールと呼ばれるもの作成しようとしているようです。このようなコントロールは (明らかに)、子ビューを適切に管理する LinearLayout などのレイアウトから派生させる必要があります。ここで示していない多くのコードを View クラスに追加した場合にのみ、View からの派生が機能します。たとえば、 と の実装です。onMeasureonDraw

まだ読んでいない場合は、Compound Controlsのドキュメントを読むことをお勧めします。

gngr44 の答えも正しいです。そのように InfoView を再利用しようとするべきではありません。Android コードを信頼してビューをリサイクルし、convertViewそうでない場合は を使用しますnull

于 2011-02-16T02:40:33.970 に答える