Добавить заголовок в 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 и классом).

Заранее спасибо.


person Ferran Negre    schedule 09.06.2013    source источник


Ответы (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

    }

Где вы можете иметь другой макет или все, что вам нравится.

person Guillermo Orellana Ruiz    schedule 11.06.2013

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.-Now, with that ID in your method getGroupView()...

LinearLayout headerList = (LinearLayout) view.findViewById(R.id.headerList);
    if(isExpanded)
        headerList.setVisibility(View.VISIBLE);
    else
        headerList.setVisibility(View.GONE);

Через год, я надеюсь, это сработает для вас :)

person Oscar Josue Alvrez    schedule 07.07.2014

Приведенное выше решение Guillermo Orellana Ruiz будет работать нормально, но обратите внимание, что только если " "дополнительный дочерний элемент" добавляется к массиву дочерних элементов в 0-ю позицию, тогда будут отображаться только все точные дочерние элементы. , иначе один дочерний элемент будет отсутствовать, если вы не добавляете один дополнительный дочерний элемент в 0-ю позицию к дочернему массиву или дочерним элементам,

Что происходит, насколько я понимаю из моей задачи, так это то, что когда добавляется «дополнительный дочерний элемент», 0-я позиция занимает этот «дополнительный дочерний элемент», и этот дочерний элемент не будет отображаться, вместо этого «дополнительного дочернего элемента» отображается представление заголовка, это делается:

      if (childPosition == 0) {
       // your header
        convertView = inflater.inflate(R.layout.list_item_child, null);            

        return convertView;
    } 

Также обратите внимание, что добавление дочернего элемента в дочерний массив должно оставаться на 0-й позиции, иначе дополнительный дочерний элемент будет отображаться в представлении списка дочерних элементов, а ваши фактические данные в 0-й позиции не будут отображаться.

Я только что упомянул об этом, потому что, когда я использовал этот код для своей задачи, один из дочерних элементов не отображался, он отсутствовал, и я некоторое время задавался вопросом, поэтому мне потребовалось некоторое время, чтобы понять это, поэтому я просто публикую это как a Обратите внимание, что люди, использующие принятый ответ, не должны тратить свое время впустую.

person Jerry Abraham    schedule 01.10.2013