getChildType および getChildView メソッドもオーバーライドするBaseExpandableListAdapterの実装を作成しました。10 個のグループがあり、そのうち 4 個には子がいます。
次の実装は、エミュレーターとテスト済みの htc デバイスで動作します。つまり
、GROUP_W を視覚的に開くと、getChildView(...) の convertView パラメータは最初は正しく null であり、後でビューを再利用します。
この実装は、Samsungs Galaxy S3 および Galaxy Tabでは機能しません。つまり、GROUP_W を視覚的に開くと、最初は getChildView(...) の convertView パラメータが null ではなく、間違ったビューが提供され、さらに例外が発生します。
@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;
}
実装を次のように変更すると、論理的な理由が見られずに、Samsung デバイスでも動作します。
@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;
}