Android自定义视图和BaseExpandableListAdapter

时间:2011-02-15 23:43:06

标签: android view expandablelistview

我想使用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;
        }
........

代码有效(即不抛出任何异常),但不显示视图。

你知道为什么吗?

感谢和问候

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您发布的代码中缺少很多内容:infopanel.xml在哪里使用?如何使用数据填充InfoView的子视图?等

但是,从发布的内容发布后,您似乎正在尝试创建所谓的Compound Control。这些控件(显然)需要从布局(例如LinearLayout)派生,以适当地管理子视图。只有当您在View类中添加了许多未在此处显示的代码时,才能使用View来实现,例如,onMeasureonDraw的实现。< / p>

如果您还没有,我建议您阅读Compound Controls上的文档。

gngr44's answer也是正确的 - 您不应该尝试以这种方式重用InfoView。相信Android代码可以为您回收视图,如果不是convertView,请使用null