複数のグループを持つ ExpandableList があり、各グループには異なるタイプ (異なるレイアウト) の子が含まれています。構造は似ているが子ビューが異なるアクティビティがいくつかあるため、カスタム アダプタを作成することにしました。アダプターは、いくつかの問題を除いて、ほとんどの場合うまく機能します。
- 子ビューにテキストを入力することはほぼ不可能です。各文字が入力されると、EditText がフォーカスを失ったように見えます。動作を説明するためにスクリーンショットを添付しました。
- グループを展開/折りたたむと、数回後に TextViews のテキストが消え、各ビューの最初の単語の最初の文字だけが表示されます。どういうわけか、レイアウト パラメータが何らかの形で誤って計算されているように見えます。
スクリーンショットは次のとおりです。
そして、これが私のアダプターのコードです:
public class GenericExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private String[] groups;
private View[] children;
public static interface ExpandableListItemClickListener {
public void onClick(View view, int groupId, int itemId);
}
public GenericExpandableListAdapter(Context context, String[] groups, int[] children) {
if(groups.length != children.length) {
throw new IllegalArgumentException("Items must have the same length as groups.");
}
this.context = context;
this.groups = groups;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.children = new View[children.length];
for(int i = 0; i < children.length; i++) {
this.children[i] = inflater.inflate(children[i], null);
}
}
public GenericExpandableListAdapter(Context context, String[] groups, View[] children) {
if(groups.length != children.length) {
throw new IllegalArgumentException("Items must have the same length as groups.");
}
this.context = context;
this.groups = groups;
this.children = children;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition];
}
@Override
public int getChildTypeCount() {
return children.length + 1;
}
@Override
public int getChildType(int groupPosition, int childPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if(convertView != null) {
return convertView;
}
return children[groupPosition];
}
@Override
public int getChildrenCount(int groupPosition) {
return 1;
}
@Override
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
@Override
public int getGroupTypeCount() {
return 1;
}
@Override
public int getGroupCount() {
return groups.length;
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public int getGroupType(int groupPosition) {
return 0;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if(convertView != null) {
((TextView) convertView).setText(getGroup(groupPosition).toString());
return convertView;
}
// Layout parameters for the ExpandableListView
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 64);
final TextView textView = new TextView(context);
textView.setLayoutParams(lp);
// Center the text vertically
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
// Set the text starting position
textView.setPadding(50, 0, 0, 0);
textView.setText(getGroup(groupPosition).toString());
return textView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
}