21

How to display more than 3- level of expandable list view, I am getting only examples for 3-Levels expandable.

Referring this :three-level-expandable-list

In this example he adding one more Expandable list in getChildView method of ParentLevel BaseExpandableListAdapter :

CustExpListview SecondLevelexplv = new CustExpListview(Home.this);
SecondLevelexplv.setAdapter(new SecondLevelAdapter());

SecondLevelexplv.setGroupIndicator(null);   
return SecondLevelexplv;

so Similarily I'am Adding one more Expandable list in the getChildView method of SecondLevelAdapter.

Its Working But View is not coming proper like 3- level of expandable list view. And I have Read this:

3-level-expandable-list-view-with-swipe-feature

multi-level-expandablelistview-in-android

issue-with-expanding-multi-level-expandablelistview

Please guideline or share me suitable example for Multi-level expandable display in android.

Thanks,

Community
  • 1
  • 1
Cropper
  • 1,177
  • 2
  • 14
  • 36

4 Answers4

23

I Found Solution and I am uploading all java class So check all java Or U can check this :

1: MainActivity.java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Object  obj = new Object();
    obj.children =  new ArrayList<Object>();
    for(int i = 0;i<Constant.state.length;i++)
    {
        Object root =  new Object();
        root.title = Constant.state[i];
        root.children =  new ArrayList<Object>();
        for(int j=0;j<Constant.parent[i].length;j++)
        {
             Object parent =  new Object();
             parent.title=Constant.parent[i][j];
             parent.children =  new ArrayList<Object>();
             for(int k=0;k<Constant.child[i][j].length;k++)
             {
                 Object child =  new Object();
                 child.title =Constant.child[i][j][k];
                 parent.children.add(child);
             }
             root.children.add(parent); 
        }
        obj.children.add(root);
    }

    if (!obj.children.isEmpty()) {
        final ExpandableListView elv = (ExpandableListView) findViewById(R.id.expList);

        elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {

                return true; /* or false depending on what you need */;
            }
        });


        ExpandableListView.OnGroupClickListener grpLst = new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition,
                    long id) {

                return true/* or false depending on what you need */;
            }
        };


        ExpandableListView.OnChildClickListener childLst = new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView eListView, View view, int groupPosition,
                    int childPosition, long id) {

                return true/* or false depending on what you need */;
            }
        };

        ExpandableListView.OnGroupExpandListener grpExpLst = new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {

            }
        };

        final RootAdapter adapter = new RootAdapter(this, obj, grpLst, childLst, grpExpLst);
        elv.setAdapter(adapter);
}


}
 }

2: Object.java

public class Object {
public String title; // use getters and setters instead
public List<Object> children; // same as above

public Object() {
    children = new ArrayList<Object>();
}
}

3:RootAdapter.java

public class RootAdapter extends BaseExpandableListAdapter {

private Object root;

private final LayoutInflater inflater;

public class Entry {
    public final CustExpListview cls;
    public final SecondLevelAdapter sadpt;

    public Entry(CustExpListview cls, SecondLevelAdapter sadpt) {
        this.cls = cls;
        this.sadpt = sadpt;
    }
}

public Entry[] lsfirst;

public RootAdapter(Context context, Object root, ExpandableListView.OnGroupClickListener grpLst,
    ExpandableListView.OnChildClickListener childLst, ExpandableListView.OnGroupExpandListener grpExpLst) {
    this.root = root;
    this.inflater = LayoutInflater.from(context);

    lsfirst = new Entry[root.children.size()];

    for (int i = 0; i < root.children.size(); i++) {
        final CustExpListview celv = new CustExpListview(context);
        SecondLevelAdapter adp = new SecondLevelAdapter(root.children.get(i),context);
        celv.setAdapter(adp);
        celv.setGroupIndicator(null);
        celv.setOnChildClickListener(childLst);
        celv.setOnGroupClickListener(grpLst);
        celv.setOnGroupExpandListener(grpExpLst);

        lsfirst[i] = new Entry(celv, adp);
    }

}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return root.children.get(groupPosition);
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
    View convertView, ViewGroup parent) {
    // second level list
    return lsfirst[groupPosition].cls;
}

@Override
public int getChildrenCount(int groupPosition) {
    return 1;
}

@Override
public Object getGroup(int groupPosition) {
    return root.children.get(groupPosition);
}

@Override
public int getGroupCount() {
    return root.children.size();
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
    ViewGroup parent) {

    // first level

    View layout = convertView;
    GroupViewHolder holder;
    final Object item = (Object) getGroup(groupPosition);

    if (layout == null) {
        layout = inflater.inflate(R.layout.item_root, parent, false);
        holder = new GroupViewHolder();
        holder.title = (TextView) layout.findViewById(R.id.itemRootTitle);
        layout.setTag(holder);
    } else {
        holder = (GroupViewHolder) layout.getTag();
    }

    holder.title.setText(item.title.trim());

    return layout;
}

private static class GroupViewHolder {
    TextView title;
}

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

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}
}

4: SecondLevelAdapter.java

public class SecondLevelAdapter extends BaseExpandableListAdapter {

public Object child;
Context mContext;
LayoutInflater inflater;

public SecondLevelAdapter(Object child,Context context) {
    this.child = child;
    this.mContext=context;
    inflater = LayoutInflater.from(mContext);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return child.children.get(groupPosition).children.get(childPosition);
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

// third level
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
        View convertView, ViewGroup parent) {
    View layout = convertView;
    final Object item = (Object) getChild(groupPosition, childPosition);

    ChildViewHolder holder;

    if (layout == null) {
        layout = inflater.inflate(R.layout.item_child, parent, false);

        holder = new ChildViewHolder();
        holder.title = (TextView) layout.findViewById(R.id.itemChildTitle);
        layout.setTag(holder);
    } else {
        holder = (ChildViewHolder) layout.getTag();
    }

    holder.title.setText(item.title.trim());

    return layout;
}

@Override
public int getChildrenCount(int groupPosition) {
    return child.children.get(groupPosition).children.size();
}

@Override
public Object getGroup(int groupPosition) {
    return child.children.get(groupPosition);
}

@Override
public int getGroupCount() {
    return child.children.size();
}

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

// Second level
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
        ViewGroup parent) {
    View layout = convertView;
    ViewHolder holder;

    final Object item = (Object) getGroup(groupPosition);

    if (layout == null) {
        layout = inflater.inflate(R.layout.item_parent, parent, false);
        holder = new ViewHolder();
        holder.title = (TextView) layout.findViewById(R.id.itemParentTitle);
        layout.setTag(holder);
    } else {
        holder = (ViewHolder) layout.getTag();
    }

    holder.title.setText(item.title.trim());

    return layout;
}

@Override
public void registerDataSetObserver(DataSetObserver observer) {
    super.registerDataSetObserver(observer);
}

@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
    Log.d("SecondLevelAdapter", "Unregistering observer");
    if (observer != null) {
        super.unregisterDataSetObserver(observer);
    }
}

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

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

private static class ViewHolder {
    TextView title;
}

private static class ChildViewHolder {
    TextView title;
}

}

5 Constant.java

public class Constant {
static String[] state = {"A","B","C"};
static  String[][] parent = {
        {"aa","bb","cc","dd","ee"},
        {"ff","gg","hh","ii","jj"},
        {"kk","ll","mm","nn","oo"}
    };

static  String[][][] child = {
            {
                {"aaa","aab","aac","aad","aae"},
                {"bba","bbb","bbc","bbd","bbe"},
                {"cca","ccb","ccc","ccd","cce","ccf","ccg"},
                {"dda","ddb","dddc","ddd","dde","ddf"},
                {"eea","eeb","eec"}
            },
            {
                {"ffa","ffb","ffc","ffd","ffe"},
                {"gga","ggb","ggc","ggd","gge"},
                {"hha","hhb","hhc","hhd","hhe","hhf","hhg"},
                {"iia","iib","iic","iid","iie","ii"},
                {"jja","jjb","jjc","jjd"}
            },
            {
                {"kka","kkb","kkc","kkd","kke"},
                {"lla","llb","llc","lld","lle"},
                {"mma","mmb","mmc","mmd","mme","mmf","mmg"},
                {"nna","nnb","nnc","nnd","nne","nnf"},
                {"ooa","oob"}
            }
        };
}

5: item_parent.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="horizontal"
android:paddingLeft="10dp" >

<TextView
    android:id="@+id/itemParentTitle"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="#5ccccc"
    android:padding="2dp"
    android:textColor="#006363"
    android:textSize="20sp" />

<ImageView
    android:id="@+id/itemParentImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</LinearLayout>
Community
  • 1
  • 1
Cropper
  • 1,177
  • 2
  • 14
  • 36
  • How the second Child View set to the fill_parent as a width if I set it to the fill_parent then the right side images not shown, please help me to solve this issue, Thanks in advance. – Samadhan Medge Dec 19 '13 at 05:47
  • Please clear your problem You are trying to add Image view in Third level and you also want view as fill_parent Or any thing else. – Cropper Dec 19 '13 at 05:56
  • Thanks for reply, In Second Level I set the layout in which I have one ImageView with attribute align_parentRight="true" but that ImageView not seen, same layout also use for parent view it shows that ImageView, why this happen. – Samadhan Medge Dec 19 '13 at 06:04
  • Check with this layout may help And it not works than comment. – Cropper Dec 19 '13 at 06:17
  • got the solution Problem was not in xml layout it was in java code, I Replace this two lines widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST); by heightMeasureSpec = MeasureSpec.makeMeasureSpec(900, MeasureSpec.AT_MOST); – Samadhan Medge Dec 19 '13 at 06:58
  • Thanks for the reply and valuable time for helping me. – Samadhan Medge Dec 19 '13 at 06:59
  • How can i set on click listener on list view item i.e. second level or third level item? – Samadhan Medge Dec 19 '13 at 14:23
  • 1
    In MainActivity.java class there is ExpandableListView.OnGroupClickListener grpLst this is second level listner and ExpandableListView.OnChildClickListener childLst this is third level listner – Cropper Dec 19 '13 at 14:32
  • – Cropper Briliant work, i am stuck with how we can set a listener on first level item can you help me? – hemant Mar 24 '14 at 06:13
  • Hi Crooper, i'm using this code for my expandable listview, everything works great.. but after few clicks, my second level is not responding, and no method is calling.. can you plz find out this... – Pandiri Deepak May 30 '14 at 12:04
  • Hi Pandiri Deepak I am bussy right now so I am unable to test but I think previously in onclickListner we return false & now I make it true. So please Check that it works or not If not please comment !!! – Cropper Jun 02 '14 at 08:58
  • Is it allow reusable component in 2nd level Expandable view like Listview or Expandable Listview? – Dhaval Khant Mar 16 '15 at 06:59
  • Yes it allow to reuse component in 2nd level – Cropper Mar 16 '15 at 13:24
  • can you post all layout files – Anand Jain Oct 07 '15 at 11:03
  • 1
    chlid list is not opened – Anand Jain Oct 07 '15 at 11:27
2

Using Expendable List View and make second expendable adapter is a way which is not recommended it make the whole processes complicated there is an easy way by inflating different view by using scroll views and inside Linear layout.....

Nouman Shah
  • 534
  • 1
  • 9
  • 22
  • This is more like a comment to an existing answer than a new answer. – slfan Apr 15 '16 at 05:54
  • actually i am posting a link where you will find efficient way to make expendable list View second level adapter does not work cool and some complication appears in it some function do not work which are required to be – Nouman Shah Apr 15 '16 at 07:38
2
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    // 999999 is a size in pixels. 
    // ExpandableListView requires a maximum height in order to do measurement calculations.
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

this makes much more reasonable length.

Alp Altunel
  • 3,324
  • 1
  • 26
  • 27
  • Its just strange. My second level headers had dispayed wrong with 2000 height pixels (it was aligned to left), this was better with 600 pixels, but when it has more than 5 rows, some rows become outside view. But with your proposal it working perfect. Do you know, what is max of pixels, which can I set to work multi-levels properly? – grabarz121 Oct 09 '17 at 13:13
  • I found some code but I cannot find it at the moment. 999999 is the maximum measure so calculation is based on the maximum amount then it is calculated to real size. But other codes are not working as expected but 999999 is working perfectly. regards. – Alp Altunel Oct 12 '17 at 06:14
0
public class CustExpListview extends ExpandableListView {

    public CustExpListview(Context context) {
        super(context);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDetachedFromWindow() {
        try {
            super.onDetachedFromWindow();
        } catch (IllegalArgumentException e) {
            // TODO: Workaround for
            // http://code.google.com/p/android/issues/detail?id=22751
        }
    }
}
IInspectable
  • 46,945
  • 8
  • 85
  • 181