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);
    }
}

信息面板.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 的子视图?等等。

但是从您发布的内容来看,您似乎正在尝试创建所谓的Compound Control。此类控件(显然)需要从适当管理子视图的布局(例如 LinearLayout)派生。仅当您向 View 类添加了更多未在此处显示的代码时,从 View 派生您已经完成的操作才有效 - 例如,onMeasure和的实现onDraw

我建议您阅读有关Compound Controls的文档(如果您还没有的话)。

gngr44 的回答也是正确的——你不应该试图以这种方式重用 InfoView。相信 Android 代码会为您回收视图,并使用convertViewif it's not null

于 2011-02-16T02:40:33.970 回答