Добавить заголовок в ChildView из ExpandableListView (Android)
Я пытаюсь найти решение для своего ответа через Интернет, но не могу найти хорошее. Я посмотрел эту тему: Android ExpandableListView дочерние заголовки но это не работает для меня.
Что у меня сейчас (Экран):
И мой код:
private void fillData() {
ExpandableListView lv;
lv = (ExpandableListView) getActivity().findViewById(R.id.grades_view);
lv.setItemsCanFocus(false);
lv.setChoiceMode(ExpandableListView.CHOICE_MODE_SINGLE);
View view = View.inflate(getActivity(), R.layout.list_header, null);
lv.addHeaderView(view, null, false);
dbh = new DatabaseHelper(getActivity());
MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(
getActivity(), dbh);
mAdapter.synchronize();
lv.setAdapter(mAdapter);
registerForContextMenu(lv);
}
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private List<Subject> mSubjects = new ArrayList<Subject>();
private List<List<Course>> mCourse = new ArrayList<List<Course>>();
private DatabaseHelper dbh;
private LayoutInflater inflater;
public MyExpandableListAdapter(Context context, DatabaseHelper dbh) {
this.dbh = dbh;
this.inflater = LayoutInflater.from(context);
}
public void synchronize() {
mSubjects = dbh.getSubjects();
for (Subject s : mSubjects) {
mCourse.add(dbh.getCourses(s));
}
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return mCourse.get(groupPosition).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return getChild(groupPosition, childPosition).hashCode();
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
Course c = (Course) getChild(groupPosition, childPosition);
if (convertView == null)
convertView = inflater.inflate(R.layout.list_item_child,
parent, false);
TextView txt = (TextView) convertView.findViewById(R.id.code);
txt.setText(c.getCode());
TextView txt1 = (TextView) convertView.findViewById(R.id.ects);
txt1.setText(String.valueOf(c.getEcts()));
TextView txt2 = (TextView) convertView.findViewById(R.id.grade);
if (c.getGrade() == -1) {
txt2.setText("-");
} else {
txt2.setText(String.valueOf(c.getGrade()));
}
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return mCourse.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return mSubjects.get(groupPosition);
}
@Override
public int getGroupCount() {
return mSubjects.size();
}
@Override
public long getGroupId(int groupPosition) {
return mSubjects.get(groupPosition).hashCode();
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
Subject s = (Subject) getGroup(groupPosition);
if (convertView == null)
convertView = inflater.inflate(R.layout.list_item, parent,
false);
TextView txt1 = (TextView) convertView.findViewById(R.id.name);
txt1.setText(String.valueOf(s.getName()));
TextView txt2 = (TextView) convertView.findViewById(R.id.semester);
txt2.setText(String.valueOf(s.getSemester()));
return convertView;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
Как видим, для размещения заголовка первого уровня (Name и Sem) я использовал:
View view = View.inflate(getActivity(), R.layout.list_header, null);
lv.addHeaderView(view, null, false);
Но я не знаю, как сделать то же самое с детьми (заголовок с кодом, ECTS и оценкой).
Спасибо вы заранее.
3 ответа:
Просто добавьте "дополнительного ребенка"
@Override public Object getChild(int groupPosition, int childPosition) { if (childPosition == 0) return null; return mCourse.get(groupPosition).get(childPosition - 1); } @Override public long getChildId(int groupPosition, int childPosition) { if (childPosition == 0) return 0; return getChild(groupPosition, childPosition).hashCode(); } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (childPosition == 0) { convertView = inflater.inflate(R.layout.list_item_child, null); // your special header return convertView; } // rest of your method }
Где вы можете иметь другой макет или все, что вам нравится.
1.- Включите заголовок в свой xml группы, например:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > //Your elementsof group </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/headerList" android:orientation="horizontal" > //the elements of your header (ID,counter, description, etc..) </LinearLayout>
2.- Теперь, с этим идентификатором в вашем методе getGroupView ()...
LinearLayout headerList = (LinearLayout) view.findViewById(R.id.headerList); if(isExpanded) headerList.setVisibility(View.VISIBLE); else headerList.setVisibility(View.GONE);
Год спустя, я надеюсь, что это работает для вас:)
Приведенное выше решение Гильермо Орельяна Руиса будет работать нормально , но обратите внимание, что только если""extra child" добавляется в массив дочерних элементов в 0-ю позицию, то будут отображаться только все точные дочерние элементы ,в противном случае один дочерний элемент будет отсутствовать, если вы не добавляете один extra child в 0-ю позицию к дочернему массиву или дочерним элементам,,
Что происходит из моего понимания моей задачи, так это то, что при добавлении "дополнительного ребенка" 0-я позиция занимает этот "дополнительный ребенок", и этот ребенок не будет отображаться, вместо этого" дополнительного ребенка " отображается представление заголовка, это делается с помощью:
if (childPosition == 0) { // your header convertView = inflater.inflate(R.layout.list_item_child, null); return convertView; }
Также обратите внимание, что дополнительный потомок Добавление в дочерний массив должно оставаться в 0-й позиции, иначе дополнительный потомок будет отображаться в вашем представлении списка потомков, а ваши фактические данные в 0-й позиции не будут отображаться
Я только что упомянул об этом, потому что, когда я использовал этот код для своей задачи, один из дочерние элементы не отображались, они отсутствовали, и я задумался на некоторое время , поэтому мне потребовалось некоторое время, чтобы понять это, поэтому я просто разместил это в виде заметки, чтобы люди, которые используют принятый ответ, не тратили свое время .