10

Ich habe viel gearbeitet, um ** N-Level-ExpandableListView zu erstellen. Ich bin in der Lage, es zu jedem Niveau zu machen, aber meine Anforderung besteht darin, den Zustand der geöffneten Gruppen auch nach dem Scrollen beizubehalten. Ich habe es mit mehreren Möglichkeiten versucht, aber immer noch nicht erfolgreich.Nach dem Aufrechterhalten der Kollaps/Expansion-Status für N-Ebene oder Multilevel erweiterbar Listview einige Untergruppen werden nicht angezeigt

Diese erweiterbare Listenansicht erfüllt alle anderen Unternehmensanforderungen als dieses Problem.

* Dies ist eine Möglichkeit, die ich ausprobiert habe. Ich kann die Zustände in Objekten speichern, aber nur wenige Untergruppen werden angezeigt. *

Ich versuchte mit OnMeasure (Breite, Höhe) -Methode, um die Höhe zu erhalten, wenn dynamisch erzeugte Liste aber immer noch nicht perfekt zu bekommen.

Auch ich ging durch eine Reihe von Artikeln für die gleiche.

Befestigt Screenshot meiner Arbeits Anwendung ..

enter image description here

Hier ist mein Code.

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

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

} 

Vielen Dank im Voraus.

+1

Jungs plz help gebucht haben wir strug gleitend mit diesem Problem von sehr lange – Pratswinz

+0

Ich habe verwendet, expanded-Variable, um den Zustand mit jeder Gruppe auf jeder Ebene zu speichern. am Anfang ist es falsch und ongroupepert und Zuhörer ich mache es wahr und oncollapselistener ich mache es falsch. Es funktioniert, aber beim Laden während Scrool versteckt es einige Gruppen. Nach dem Klicken auf eine andere Untergruppe wurde es angezeigt. –

+1

Vielleicht wäre es besser, TreeView-Bibliothek zu verwenden - https://github.com/bmelnychuk/AndroidTreeView – Oleksandr

Antwort

3

Ich habe das gleiche Problem zuvor mit N-Ebene Expandable ListView, verwende ich einen Trick, der nur ein Erweitern Element anzeigt. Obwohl es nicht die beste Lösung für Sie ist, hoffen Sie, dass es hilft!

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

und das gleiche auf secondLevelExpListView

UPDATE:

Eine weitere Möglichkeit, wie die folgende (zusammen mit oben setOnGroupExpandListener) versuchen:

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

Dann in Ihrem ParentLevelAdapter rufen Sie dies an:

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

Wenn Sie nicht setOnGroupExpandListener verwenden möchten, dann sollten Sie heightMeasureSpec wie diese heightMeasureSpec = MeasureSpec.makeMeasureSpec(20000, MeasureSpec.AT_MOST);

erhöhen Bitte beachten Sie, dass ich nur mit 3-stufigen erweiterbare Liste Ansicht getestet haben, können Sie mehr auf meine Antwort lesen auf folgende Frage:

How to add Three Level ListView in ExpandableListView in android

ich mein ganzes Projekt GitHub