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.
- Recuperar ChildItem de ExpandableListView?
- Rellene ExpandableListView con datos de SQLite
- Cómo llamar a notifyDataSetChanged para Custom ExpandableListView?
- ExpandableListView dentro de ExpandableListView
- Android ExpandableListActivity y SimpleCursorTreeAdapter?
* 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 ..
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.
- Android ExpandableListView con animación
- Implementar el divisor entre el último elemento del niño y el siguiente grupo de cabecera.
- ¿Cómo puedo replicar este patrón de interfaz de usuario: haga clic en el elemento ListView y expanda debajo de él?
- Animación para expandibleListView
- Lista de visualización de Android usando expandibleListView
- Contraer todo el grupo excepto el grupo seleccionado en el listview expandible android
- Establecer bordes para un elemento de grupo expandido mediante ExpandableListView
- Botón en lista desplegable android
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
- Patrón de diseño de inicio de sesión de aplicaciones de Android
- Context.getPackageName () vs BuildConfig.APPLICATION_ID