如何显示3级以上的可展开列表视图?

如何显示3级以上的可扩展列表视图,我只能得到3级可扩展的示例。

参考这个: 三级可扩展列表

在这个例子中,他在ParentLevel BaseExpandableListAdapter getChildView方法中增加了一个Expandable列表:

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

所以Similarily I'am在SecondLevelAdaptergetChildView方法中添加一个更多的Expandable列表。

它的工作,但视图不能像三级可扩展列表视图。 我已阅读此:

3级-可扩展列表-视图-与碰擦特征

多层次,expandablelistviewfunction于安卓

问题-与扩展的多级expandablelistview

请指导或分享我适合在Android多级可扩展显示的例子。

谢谢,

我find解决scheme,我上传所有的Java类所以检查所有的Java或U可以检查这一点 :

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> 

使用消耗型列表视图,使第二个消耗适配器是一种不推荐的方式,它使整个过程变得复杂,有一个简单的方法,通过使用滚动视图和内部的膨胀不同的视图线性布局…..

 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); } 

这使得长度更合理。

 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 } } }