bircastri
bircastri

Reputation: 2167

How to insert header row on Expandable List View

I have an Android activity with one expandable list view. Then I have created my ExpandableListAdapter, so I can click on one items and I can see the child of this item. This is ok. Now I want to insert a standard header (Title) for a list of child to every items. So I have build this code:

public class ResultExpandableListAdapter extends BaseExpandableListAdapter {

    private Context context;
    private List<Result> listaRisultati;
    private HashMap<Integer, List<ResultXResult>> expandableListDetail;

    public ResultExpandableListAdapter(Context context, List<Result> listaRisultati,
                                       HashMap<Integer, List<ResultXResult>> expandableListDetail) {
        this.context = context;
        this.listaRisultati = listaRisultati;
        this.expandableListDetail = expandableListDetail;
    }

    @Override
    public Object getChild(int listPosition, int expandedListPosition) {
        return this.expandableListDetail.get(this.listaRisultati.get(listPosition).getId())
                .get(expandedListPosition);
    }

    @Override
    public long getChildId(int listPosition, int expandedListPosition) {
        return expandedListPosition;
    }

    @Override
    public View getChildView(int listPosition, final int expandedListPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            if(expandedListPosition ==0)
            {
                convertView = layoutInflater.inflate(R.layout.results_x_result_list_item_header, null);
            }

            if(expandedListPosition>0 && expandedListPosition<=getChildrenCount(expandedListPosition))
            {
                ResultXResult risultato = (ResultXResult) getChild(listPosition, expandedListPosition);
                convertView = layoutInflater.inflate(R.layout.results_x_result_list_item,null);

                TextView parameter = (TextView) convertView
                        .findViewById(R.id.parameter);

                TextView valueUM = (TextView) convertView
                        .findViewById(R.id.valueUm);

                TextView interpretation = (TextView) convertView
                        .findViewById(R.id.interpretation);

                TextView um = (TextView) convertView
                        .findViewById(R.id.um);


                parameter.setText(risultato.getInfo().getDisplayName());
                valueUM.setText(risultato.getValue());
                interpretation.setText(risultato.getInterpretationCode().getDisplayName());
                um.setText(risultato.getUnitaDiMisura());
            }
        }

        return convertView;
    }

    @Override
    public int getChildrenCount(int listPosition) {
        return this.expandableListDetail.get(this.listaRisultati.get(listPosition).getId())
                .size();
    }

    @Override
    public Object getGroup(int listPosition) {
        return this.listaRisultati.get(listPosition);
    }

    @Override
    public int getGroupCount() {
        return this.listaRisultati.size();
    }

    @Override
    public long getGroupId(int listPosition) {
        return listPosition;
    }

    @Override
    public View getGroupView(int listPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        Result result = (Result) getGroup(listPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.results_list_row, null);
        }
        TextView examination = (TextView) convertView
                .findViewById(R.id.examination);
        TextView startDate = (TextView) convertView
                .findViewById(R.id.startDate);
        TextView endDate = (TextView) convertView
                .findViewById(R.id.endDate);
        examination.setTypeface(null, Typeface.BOLD);

        examination.setText(result.getInfo().getDisplayName());
        startDate.setText(result.getDateStart());
        endDate.setText(result.getDateEnd()!=null ? result.getDateEnd()+" " : " ");
        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int listPosition, int expandedListPosition) {
        return true;
    }
}

The my temporary solution is in the method "getChildView", if is the first row, I can insert one layour, if is another row, I print the data. So with this code, if I have a list of ResultXResult with 2 Items (for example), I can read only the second items.

There is a solution of this problem, or there is another method to insert a header in child view?

This is my app running: enter image description here

The header row for me is the yellow row "Parameter, Value...."

Upvotes: 3

Views: 1987

Answers (2)

Ameer Faisal
Ameer Faisal

Reputation: 355

You cam easily add header to expandablelistview by using the code below :

View header=getLayoutInflater().inflate(R.layout.nav_header, null);
 mExpandableListView.addHeaderView(header);

Just copy the above code in your activity. In the above code (R.layout.nav_header) is the xml file of header and mExpandableListView is the object of ExpandableListView.

Upvotes: 4

Awadesh
Awadesh

Reputation: 4058

You are right. In order to add Header and footer to expandableListview, you can do some modifications.

getChildrenCount() method returns the count of row of child item in a specific group. Here we can add two extra rows to the return method. The first row will be used for header and the second row will be used for footer. and we can inflate the specific layout to first(header) and last row(footer) of a group.

Upvotes: 0

Related Questions