我想使用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;
}
........
代码有效(即不抛出任何异常),但不显示视图。
你知道为什么吗?
感谢和问候
答案 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来实现,例如,onMeasure
和onDraw
的实现。< / p>
如果您还没有,我建议您阅读Compound Controls上的文档。
gngr44's answer也是正确的 - 您不应该尝试以这种方式重用InfoView。相信Android代码可以为您回收视图,如果不是convertView
,请使用null
。