Después de mantener el estado de colapso / expansión para nivel N o Multinivel lista ampliable algunos subgrupos no se muestran

He trabajado mucho para crear ** N-level expandableListView. Soy capaz de hacerlo a cualquier nivel, pero mi requisito es mantener el estado de los grupos abiertos, incluso después de desplazamiento. He intentado con múltiples formas, pero aún no ha tenido éxito.

Este ListView expandible cumple con todos los requisitos de la empresa, aparte de este problema.

* Esta es una manera, que he intentado. Puedo ahorrar los estados dentro de objetos pero pocos subgrupos no están consiguiendo exhibidos. *

Intenté con onMeasure (anchura, altura) el método para mantener la altura cuando la lista generada dinámica pero todavía no pudo conseguir perfecto uno.

También fui a través de una serie de artículos para el mismo.

Captura de pantalla adjunta de mi aplicación de trabajo ..

Introduzca aquí la descripción de la imagen

Aquí está mi código.

public class ParentLevelAdapter extends BaseExpandableListAdapter { private Context context; private View convertView; Account account; private ArrayList<Model_Departments> list_departments; public ParentLevelAdapter (Context context, ArrayList<Model_Departments> list_departments, Account account) { this.context = context; this.list_departments = list_departments; this.account = account; } public void updateList(Context context, ArrayList<Model_Departments> list_departments, Account account) { notifyDataSetChanged(); } @Override public Object getChild(int arg0, int arg1) { return this.getChild(arg0, arg1); } @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 SecondLevelExpandableListView subGroupListView; SecondListView employeeLisView = null; if (convertView == null) { if (list_departments.get(groupPosition).hasSubGroups()) { subGroupListView = new SecondLevelExpandableListView( context); subGroupListView.setGroupIndicator(null); adap = new ParentLevelAdapter (context, list_departments.get(groupPosition).subgroups, account); subGroupListView.setAdapter(adap); return subGroupListView; } else { employeeLisView = new SecondListView(context); employeeLisView.setAdapter(new EmployeeAdapter(context, list_departments.get (groupPosition).employee, account)); return employeeLisView; } } else { if (list_departments.get(groupPosition).hasSubGroups()) { if (convertView instanceof SecondLevelExpandableListView) { subGroupListView = (SecondLevelExpandableListView) convertView; subGroupListView.onMeasure(10000, 999999); subGroupListView.setGroupIndicator(null); adap = new ParentLevelAdapter (context, list_departments.get(groupPosition).subgroups, account); subGroupListView.setAdapter(adap); return subGroupListView; } else { subGroupListView = new SecondLevelExpandableListView( context); subGroupListView.setGroupIndicator(null); adap = new ParentLevelAdapter (context, list_departments.get(groupPosition).subgroups, account); subGroupListView.setAdapter(adap); return subGroupListView; } } else { if (convertView instanceof SecondListView) { employeeLisView = (SecondListView) convertView; employeeLisView.setAdapter(new EmployeeAdapter(context, list_departments.get(groupPosition).employee, account)); return employeeLisView; } else { employeeLisView = new SecondListView(context); employeeLisView.setAdapter(new EmployeeAdapter(context, list_departments.get(groupPosition).employee, account)); return employeeLisView; } } } } @Override public int getChildrenCount(int groupPosition) { // return list_departments.get(groupPosition).subgroups.size(); return 1; } @Override public Object getGroup(int groupPosition) { return list_departments.get(groupPosition); } @Override public int getGroupCount() { return list_departments.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertV, ViewGroup parent) { convertView = convertV; // Log.v("ParentAdapter GroupView ",list_departments.get(groupPosition).name); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.layout_icon_node, null); TextView text = (TextView) convertView .findViewById(R.id.node_value); // text.setText("SECOND LEVEL"); text.setText(list_departments.get(groupPosition).name); } else { TextView text = (TextView) convertView .findViewById(R.id.node_value); text.setText(list_departments.get(groupPosition).name); } if (list_departments.get(groupPosition).isExpanded()) { Log.i("Group Position=", groupPosition + " NAme=" + list_departments.get(groupPosition).name); ((SecondLevelExpandableListView) parent) .expandGroup(groupPosition); } /* code to save state for Group expand and collapse for individual objects*/ ((SecondLevelExpandableListView) parent) .setOnGroupExpandListener(new OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { // TODO Auto-generated method stub list_departments.get(groupPosition).setExpanded( true); Log.i("Group", "Expand groupposition=" + groupPosition); Log.i("Group", "Expand" + list_departments .get(groupPosition).name); } }); ((SecondLevelExpandableListView) parent) .setOnGroupCollapseListener(new OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { // TODO Auto-generated method stub list_departments.get(groupPosition).setExpanded( false); Log.i("Group", "Collapse groupposition=" + groupPosition); Log.i("Group", "Collapse" + list_departments .get(groupPosition).name); } }); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

Mi Pojo_Object:

 public class Model_Departments implements Comparable<Model_Departments>{ public String name; protected long parent_id; private boolean isexpanded; public boolean isExpanded() { return isexpanded; } public void setExpanded(boolean isexpanded) { this.isexpanded = isexpanded; } public ArrayList<Model_Departments> subgroups = new ArrayList<>(); public ArrayList<Model_Employees> employee = new ArrayList<>(); public Model_Departments(String department_name, long parent_id) { this.name = department_name; this.parent_id = parent_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getParent_id() { return parent_id; } public void setParent_id(long parent_id) { this.parent_id = parent_id; } public ArrayList<Model_Departments> getSubgroups() { return subgroups; } public void setSubgroups(ArrayList<Model_Departments> subgroups) { this.subgroups = subgroups; } public ArrayList<Model_Employees> getEmployee() { return employee; } public void setEmployee(ArrayList<Model_Employees> employee) { this.employee = employee; } public boolean hasEmployees() { if (employee != null && employee.size() > 0) return true; else return false; } public boolean hasSubGroups() { if (subgroups != null && subgroups.size() > 0) return true; else return false; } @Override public int compareTo(Model_Departments another) { if(this.hasSubGroups()) { Collections.sort(this.subgroups); } return this.getName().compareTo(another.getName()); } } 

Model_Employee.java

 public class Model_Employees implements Comparable<Model_Employees>{ public String name; public Model_Employees(String name, String location) { super(); this.name = name; } public Model_Employees() { // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Model_Employees another) { return this.getName().compareTo(another.getName()); } } 

Gracias por adelantado.

Tengo el mismo problema antes con N-nivel Expandible ListView, uso un truco que muestra sólo un elemento de expansión. Aunque no parece la mejor solución para usted, sin embargo, espero que ayude!

  // display only one expand item mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { int previousGroup = -1; @Override public void onGroupExpand(int groupPosition) { if (groupPosition != previousGroup) mExpandableListView.collapseGroup(previousGroup); previousGroup = groupPosition; } }); 

Y lo mismo en secondLevelExpListView

ACTUALIZAR:

Otra forma en que puede probar lo siguiente (junto con setOnGroupExpandListener ):

 public class CustomExpListView extends ExpandableListView { public CustomExpListView(Context context) { super(context); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

Entonces dentro de su ParentLevelAdapter llame a esto:

  @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final CustomExpListView secondLevelExpListView = new CustomExpListView(this.mContext); String parentNode = (String) getGroup(groupPosition); secondLevelExpListView.setAdapter(new SecondLevelAdapter(this.mContext, mListData_SecondLevel_Map.get(parentNode), mListData_ThirdLevel_Map)); secondLevelExpListView.setGroupIndicator(null); secondLevelExpListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { int previousGroup = -1; @Override public void onGroupExpand(int groupPosition) { if (groupPosition != previousGroup) secondLevelExpListView.collapseGroup(previousGroup); previousGroup = groupPosition; } }); return secondLevelExpListView; } 

Si no desea utilizar setOnGroupExpandListener , debe aumentar heightMeasureSpec como este heightMeasureSpec = MeasureSpec.makeMeasureSpec(20000, MeasureSpec.AT_MOST);

Tenga en cuenta que sólo he probado con la vista de lista ampliable de 3 niveles, puede leer más en mi respuesta en la siguiente pregunta:

Cómo agregar tres niveles ListView en ExpandableListView en android

He publicado mi proyecto completo en GitHub

  • Deslice el efecto hacia abajo en ExpandableListView
  • ExpandableListView Animación de diapositivas en el grupo expand / collapse
  • Android ExpandableListView Parent con botón
  • No se pudo leer la fila 1, col -1 de CursorWindow. Asegúrese de que el cursor se inicialice correctamente antes de acceder a los datos de él
  • ExpandableListView con múltiples diseños
  • ExpandableListView getChildrenCount no se llama después de los datos cambiados, dando lugar a IndexOutOfBoundsException
  • Android ExpandableListView largo grupo haga clic en el oyente evitar la expansión
  • Android: ¿Hay una manera de animar tanto el grupo como el listview de un ExpandableListView?
  • Comportamiento del selector de lista expandible de Android
  • Obtener el contexto de PopupMenu como ContextMenu
  • GetChildView no se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.