我编写了BaseExpandableListAdapter的实现,它也覆盖了 getChildType 和 getChildView 方法。有10个小组,其中4个有孩子。
以下实现适用于模拟器和经过测试的 htc 设备。这意味着:
当我以可视方式打开 GROUP_W 时, getChildView(...) 的 convertView 参数第一次正确地为 null 并稍后重用该视图。
此实现不适用于三星 Galaxy S3 和 Galaxy Tab。这意味着:当我以可视方式打开 GROUP_W 时,getChildView(...) 的 convertView 参数第一次不为空,并提供了错误的视图,从而进一步导致异常。
@Override
public int getChildType(int groupPosition, int childPosition) {
switch (groupPosition) {
case GROUP_W:
return 0;
case GROUP_X:
case GROUP_Y:
return 1;
case GROUP_Z:
return 2;
default:
// actually not used
return super.getChildType(groupPosition, childPosition);
}
}
@Override
public int getChildTypeCount() {
return 3;
}
当我将实现更改为以下时,没有看到任何合乎逻辑的原因,那么它也适用于三星设备。
@Override
public int getChildType(int groupPosition, int childPosition) {
switch (groupPosition) {
case GROUP_W:
return 1;
case GROUP_X:
case GROUP_Y:
return 2;
case GROUP_Z:
return 3;
default:
return super.getChildType(groupPosition, childPosition);
}
}
@Override
public int getChildTypeCount() {
return 4;
}
是否有人也有这种奇怪的行为,或者有人了解我在做什么或出了什么问题?非常感谢 ;)
编辑:添加 getChildView()
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
Context context = parent.getContext();
switch (groupPosition) {
case GROUP_W:
X x = arrayX[childPosition];
return ListItemFactory.getTwoLineListItemTextIndicatorTopRight(context, x.getString1(), x.getString2(), x.getString3(), convertView);
case ...
default:
return null;
}
}
public static View getTwoLineListItemTextIndicatorTopRight(Context context, CharSequence line1, CharSequence line2,
CharSequence indicator, View convertView) {
View view;
if (convertView == null) {
view = View.inflate(context, R.layout.two_line_list_item_textindicator_topright, null);
}
else {
view = convertView;
}
// here happens a null pointer exception because textView1 is not available in the wrong convert view
((TextView) view.findViewById(R.id.textView1)).setText(line1);
((TextView) view.findViewById(R.id.textView2)).setText(line2);
if (indicator == null || indicator == "") {
((TextView) view.findViewById(R.id.textViewIndicator)).setVisibility(View.GONE);
}
else {
TextView textView = ((TextView) view.findViewById(R.id.textViewIndicator));
textView.setText(indicator);
textView.setVisibility(View.VISIBLE);
}
return view;
}