10

Ho lavorato molto per creare ** N livello espandibileListView. Sono in grado di raggiungere qualsiasi livello, ma il mio requisito è quello di mantenere lo stato dei gruppi aperti anche dopo lo scorrimento. Ho provato con diversi modi, ma ancora senza successo.Dopo aver mantenuto lo stato di compressione/espansione per N-level o Multilevel, espandere la visualizzazione di alcuni sottogruppi.

Questa listview espandibile soddisfa tutti i requisiti aziendali diversi da questo problema.

* Questo è un modo, che ho provato. Sono in grado di salvare gli stati all'interno degli oggetti ma pochi sottogruppi non vengono visualizzati. *

Ho provato con il metodo onMeasure (larghezza, altezza) per mantenere l'altezza quando elenco dinamico generato ma non è riuscito a ottenere uno perfetto.

Inoltre ho esaminato un certo numero di articoli per lo stesso.

screenshot allegato della mia applicazione di lavoro ..

enter image description here

Ecco il mio codice.

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

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

} 

Grazie in anticipo.

+1

ragazzi plz aiuto siamo Strug ho letto questo problema da molto tempo – Pratswinz

+0

ho usato la variabile isexpanded per salvare lo stato con ogni gruppo a qualsiasi livello. inizialmente è falso e ongroupexpand listener lo sto rendendo vero e oncollapselistener lo sto rendendo falso. Funziona ma durante il caricamento durante lo scrool nasconde alcuni gruppi. Dopo aver fatto clic su un altro sottogruppo è stato visualizzato. –

+1

Forse sarebbe meglio usare la libreria TreeView - https://github.com/bmelnychuk/AndroidTreeView – Oleksandr

risposta

3

Ho già lo stesso problema con ListView espandibile a livello N, utilizzo un trucco che visualizza solo un elemento di espansione. Anche se non sembra la soluzione migliore per te, spero che sia d'aiuto!

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

e lo stesso secondLevelExpListView

UPDATE:

Un altro modo si può provare come le seguenti (insieme sopra 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); 
    } 
} 

Poi all'interno del vostro ParentLevelAdapter chiama questo:

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

Se non si desidera utilizzare setOnGroupExpandListener, allora si dovrebbe aumentare heightMeasureSpec come questo heightMeasureSpec = MeasureSpec.makeMeasureSpec(20000, MeasureSpec.AT_MOST);

Si prega di notare che ho testato solo con 3 livelli visualizzazione elenco espandibile, si può leggere di più alla mia risposta alla seguente domanda:

How to add Three Level ListView in ExpandableListView in android

ho inviato il mio progetto completo per GitHub