Implement Expandable ListView using Custom Adapter

divyang7 picture divyang7 · Jul 30, 2013 · Viewed 28k times · Source

I want to implement a custom adapter for Expandable ListView which consist of an ImageView, and 2 TextViews. I have successfully implemented the Simple Expandable ListView with Array Adapter. What changes must be done in the following two classes (first class is Adapter class and second is the Activity to display Expandable ListView) to implement the desired Custom Layout? Below are classes that need to be changed:

Below is the Adapter Class:

package com.example.travelplanner;

import java.util.List;
import java.util.Map;

import android.R.string;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter implements OnClickListener{

    private Activity context;
    private Map<String, List<String>> itemcollections;
    private List<String> item;
    TextView childtv;
    Button btn_cat_explore;
    public ExpandableListAdapter(Activity context, List<String> item_names, Map<String, List<String>> collections){
        this.context = context;
        this.item = item_names;
        this.itemcollections = collections;
    }
    @Override
    public Object getChild(int groupposition, int childposition) {
        // TODO Auto-generated method stub
        return itemcollections.get(item.get(groupposition)).get(childposition);
    }

    @Override
    public long getChildId(int groupposition, int childposition) {
        // TODO Auto-generated method stub
        return childposition;
    }

    @Override
    public View getChildView(int groupposition, int childpostion, boolean isLastchild, View convertview,
            ViewGroup parent) {
        // TODO Auto-generated method stub
        final String childitem = (String) getChild(groupposition, childpostion);
        LayoutInflater inflater = context.getLayoutInflater();
        if(convertview==null){
            convertview = inflater.inflate(R.layout.child_item, null);
        }
        childtv = (TextView)convertview.findViewById(R.id.child_text);
        childtv.setText(childitem);
        return convertview;
    }

    @Override
    public int getChildrenCount(int groupposition) {
        // TODO Auto-generated method stub
        return itemcollections.get(item.get(groupposition)).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        // TODO Auto-generated method stub
        return item.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        // TODO Auto-generated method stub
        return item.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        // TODO Auto-generated method stub
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        String itemname = (String) getGroup(groupPosition);
        if(convertView==null){
            LayoutInflater groupinflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = groupinflater.inflate(R.layout.group_item, null);
        }
        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

}

Below is my TourCatActivity.java:

package com.example.travelplanner;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;

public class TourCatActivity extends Activity {

    List<String> groupList;
    List<String> childList;
    Map<String, List<String>> catcollection;
    ExpandableListView expListView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tour_cat);
        //Tab view
        TabHost tabHost=(TabHost)findViewById(R.id.tabhost);
        tabHost.setup();

        TabSpec spec1=tabHost.newTabSpec("Tab 1");
        spec1.setContent(R.id.tab1);
        spec1.setIndicator("Category");

        TabSpec spec2=tabHost.newTabSpec("Theme");
        spec2.setIndicator("Theme tours");
        spec2.setContent(R.id.tab2);

        tabHost.addTab(spec1);
        tabHost.addTab(spec2);

        createGroupList();

        createCollection();
        expListView = (ExpandableListView) findViewById(R.id.expandableListView1);
        final ExpandableListAdapter expListAdapter = new ExpandableListAdapter(
                this, groupList, catcollection);
        expListView.setAdapter(expListAdapter);
        expListView.setOnChildClickListener(new OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                    int groupPosition, int childPosition, long id) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }
       private void createGroupList() {
            groupList = new ArrayList<String>();
            groupList.add("Rajasthan");
            groupList.add("Golden Triangle");
            groupList.add("Luxury Trains");
            groupList.add("Heritage Tours");
            groupList.add("Cultural Tours");
            groupList.add("Beyond India Tours");
        }

       private void createCollection() {
            // preparing category collection(child)
            String[] hpModels = { "HP Pavilion G6-2014TX", "ProBook HP 4540",
                    "HP Envy 4-1025TX" };
            String[] hclModels = { "HCL S2101", "HCL L2102", "HCL V2002" };
            String[] lenovoModels = { "IdeaPad Z Series", "Essential G Series",
                    "ThinkPad X Series", "Ideapad Z Series" };
            String[] sonyModels = { "VAIO E Series", "VAIO Z Series",
                    "VAIO S Series", "VAIO YB Series" };
            String[] dellModels = { "Inspiron", "Vostro", "XPS" };
            String[] samsungModels = { "NP Series", "Series 5", "SF Series" };

            catcollection = new LinkedHashMap<String, List<String>>();

            for (String laptop : groupList) {
                if (laptop.equals("HP")) {
                    loadChild(hpModels);
                } else if (laptop.equals("Dell"))
                    loadChild(dellModels);
                else if (laptop.equals("Sony"))
                    loadChild(sonyModels);
                else if (laptop.equals("HCL"))
                    loadChild(hclModels);
                else if (laptop.equals("Samsung"))
                    loadChild(samsungModels);
                else
                    loadChild(lenovoModels);

                catcollection.put(laptop, childList);
            }
        }

        private void loadChild(String[] laptopModels) {
            childList = new ArrayList<String>();
            for (String model : laptopModels)
                childList.add(model);
        }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.tour_cat, menu);
        return true;
    }

}

Answer

Tofeeq Ahmad picture Tofeeq Ahmad · Jul 30, 2013

Here is the best example of Expandable ListView with Customization. Let me know in case of any difficulty. I guess ExpandableBaseAdapter is the thing you need to look deep