Ausgabe mit erweitertem mehrstufigem ExpandableListView

Ich habe ein Multi Level (3 Levels, Root -> Parent -> Child) ExpandableListView mit Kindern, die auch ExpandableListViews sind. Ich habe kein Problem, sie zu füllen; Allerdings muss ich ein bestimmtes Element in der übergeordneten Ebene erweitern, wenn ich zuerst die Aktivität (onCreate) anzeigt.

Ich erweitere das verwandte Wurzelobjekt des Elternteils, aber ich kann nicht scheinen, das übergeordnete Element zu erweitern. Die angegebenen Zuhörer werden angerufen und doch wird das Ergebnis nicht in meiner mehrstufigen Liste widergespiegelt.

Aktivität, in der ich die Erweiterung nenne:

public class Activity { private int groupToExpand = 4, childToExpand = 3; protected void onCreate(Bundle savedInstance) { final ExpandableListView elv = (ExpandableListView) findViewById(R.id.elv); if (arrayList!= null && !arrayList.isEmpty()) { elv.setAdapter(new RootAdapter(this, arrayList); // this selects the correct group, but doesn't expand the child. elv.setSelectedChild(groupToExpand, childToExpand, true); elv.expandGroup(groupToExpand); // this works. } } } 

Mein Wurzeladapter:

 public class RootAdapter extends BaseExpandableListAdapter { private List<Objects> arrayList; private Context context; private LayoutInflater inflater; public RootAdapter(Context context, List<Objects> arrayList) { this.context = context; this.arrayList = arrayList; this.inflater = LayoutInflater.from(context); } @Override public Object getChild(int groupPosition, int childPosition) { final Objects parent = (Objects) getGroup(groupPosition); return parent.arrayList.get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final Objects o = (Objects) getChild(groupPosition, childPosition); CustomExpandableListView elv = (CustomExpandableListView) convertView; ChildViewHolder holder; if (elv == null) { holder = new ChildViewHolder(); elv = new CustomExpandableListView(context); elv.setGroupIndicator(null); elv.setDivider(null); elv.setCacheColorHint(Color.parseColor("#00000000")); elv.setChildDivider(null); elv.setChildIndicator(null); elv.setScrollingCacheEnabled(false); elv.setAnimationCacheEnabled(false); holder.cListView = elv; elv.setTag(holder); } else { holder = (ChildViewHolder) elv.getTag(); } final ParentAdapter adapter = new ParentAdapter(context, o); holder.cListView.setAdapter(adapter); return elv; } private static class ChildViewHolder { CustomExpandableListView cListView; } @Override public int getChildrenCount(int groupPosition) { final Objects parent = (Objects) getGroup(groupPosition); return parent.arrayList.size(); } @Override public Object getGroup(int groupPosition) { return arrayList.get(groupPosition); } @Override public int getGroupCount() { return arrayList.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View layout = convertView; GroupViewHolder holder; final Objects o = (Objects) getGroup(groupPosition); if (layout == null) { layout = inflater.inflate(R.layout.item_to_inflate, parent, false); holder = new GroupViewHolder(); holder.title = (TextView) layout.findViewById(R.id.title); holder.image = (ImageView) layout.findViewById(R.id.image); layout.setTag(holder); } else { holder = (GroupViewHolder) layout.getTag(); } holder.title.setText(o.title.trim()); return layout; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private static class GroupViewHolder { TextView title; ImageView image; } public class CustomExpandableListView extends ExpandableListView { public CustomExpandableListView(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

Endlich mein ParentAdapter:

 public class ParentAdapter extends BaseExpandableListAdapter { private Objects child; private LayoutInflater inflater; public ParentAdapter(Context context, Objects child) { this.child = child; this.inflater = LayoutInflater.from(context); } @Override public Object getChild(int groupPosition, int childPosition) { return child.arrayList.get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View layout = convertView; final Objects o = (Objects) getChild(0, childPosition); ChildViewHolder holder; if (layout == null) { layout = inflater.inflate(R.layout.item_to_inflate, parent, false); holder = new ChildViewHolder(); holder.title = (TextView) layout.findViewById(R.id.title); layout.setTag(holder); } else { holder = (ChildViewHolder) layout.getTag(); } holder.title.setText(o.title.trim()); return layout; } @Override public int getChildrenCount(int groupPosition) { return child.arrayList.size(); } @Override public Object getGroup(int groupPosition) { return child; } @Override public int getGroupCount() { return 1; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View layout = convertView; GroupViewHolder holder; if (layout == null) { layout = inflater.inflate(R.layout.item_to_inflate, parent, false); holder = new GroupViewHolder(); holder.image = (ImageView) layout.findViewById(R.id.image); holder.title = (TextView) layout.findViewById(R.id.title); layout.setTag(holder); } else { holder = (GroupViewHolder) layout.getTag(); } holder.title.setText(o.title.trim()); return layout; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } private static class GroupViewHolder { TextView title; ImageView image; } private static class ChildViewHolder { TextView title; } } 

Ich kann die Kinderlisten nicht innerhalb der Wurzel erweitern ExpandableListView; Kennen Sie irgendeinen richtigen Weg, um die Elemente auf der Ebene der Eltern zu erweitern?

Ich habe in getChildView des RootAdapter versucht:

 if (groupToExpand == groupPosition && childToExpand == childPosition) { elv.expandGroup(childToExpand); } 

Dann habe ich mich in der Aktivität geändert:

 if (arrayList!= null && !arrayList.isEmpty()) { RootAdapter adapter = new RootAdapter(this, arrayList); elv.setAdapter(adapter); // this selects the correct group, but doesn't expand the child. elv.setSelectedChild(groupToExpand, childToExpand, true); elv.expandGroup(groupToExpand); // this works. adapter.groupToExpand = groupToExpand; adapter.childToExpand = childToExpand; adapter.notifyDataSetChanged(); } 

Dies erweitert das übergeordnete Element, ABER, es erzeugt doppelte Elemente des übergeordneten Elements. Wie mache ich das richtig? Ist das der richtige Weg, aber mein Adapter ist defekt und erzeugt so doppelte Gegenstände?

Ich kann einfach nicht finden was ich hier fehle …

2 Solutions collect form web for “Ausgabe mit erweitertem mehrstufigem ExpandableListView”

Ich landete mit einem Multi-Level-ExpandableListView-Adapter von einem anderen Post in stackoverflow. Leider kann ich den Link nicht mehr finden, also werde ich einfach meinen Code hier posten.

Top Level des ExpandableListView Adapters.

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; // you can change the constructor depending on which listeners you wan't to use. 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)); 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 childPosition; } @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; } } 

Custom ExpandableListView mit der Lösung für Artikel, die manchmal nicht angezeigt werden. Es gibt auch einen Workaround zu einem bekannten Bug für IllegalArgumentException, der beim Zerstören der Ansicht aufgerufen wird (indem man den Back-Button drückt).

CustExpListview.java:

 public class CustExpListview extends ExpandableListView { public CustExpListview(Context context) { super(context); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // the value (2000) should not be fixed and be calculated // as follows: cell_height x root_items_count x root_items_children_count heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, 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 } } } 

Schließlich ist der Code zum letzten Level-Adapter.

 public class SecondLevelAdapter extends BaseExpandableListAdapter { public Object child; public SecondLevelAdapter(Object child) { this.child = child; } @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; } } 

Ich hoffe das hilft!!!

Aktualisieren

Dies ist ein Beispiel dafür, wie ich den obigen Adapter anrufe.

Hauptaktivität:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final List<Object> objects = yourItems; if (!objects.isEmpty()) { final ExpandableListView elv = (ExpandableListView) findViewById(R.id.yourExpandableListView); /* Item click listeners below */ // First level items in the ExpandableListView elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition, long id) { // TODO: whatever you need return false /* or true depending on what you need */; } }); // Second level items in the ExpandableListView ExpandableListView.OnGroupClickListener grpLst = new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition, long id) { // TODO: whatever you need return false /* or true depending on what you need */; } }; // Third (and last) level items in the ExpandableListView ExpandableListView.OnChildClickListener childLst = new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView eListView, View view, int groupPosition, int childPosition, long id) { // TODO: whatever you need return false /* or true depending on what you need */; } }; ExpandableListView.OnGroupExpandListener grpExpLst = new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { /* this one is not required of course, you can delete it from the RootAdapter Constructor * it is just an example as to how to implement Listeners on the second level items */ } }; final RootAdapter adapter = new RootAdapter(this, objects, grpLst, childLst, grpExpLst); elv.setAdapter(adapter); } } 

So würde mein Klassenobjekt aussehen.

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

Dies ist das beste Beispiel, das ich gefunden und verwendet habe auch: http://androidcodesnips.blogspot.in/2011/09/three-level-expandable-list.html

Seine Arbeit, ich habe es als meine Notwendigkeit geändert.

Tags: 3 level expandablelistview, mehrstufige listview

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.