2016-10-12 5 views
0

Ich versuche, eine Listview zu erstellen, die mit einer benutzerdefinierten Implementierung von erweiterbarem Listview unendlich skalierbar ist. Ich habe meinen Code auf How to display more than 3- levels of expandable List View? basiert.Infinite Level Listview

Leider zeigt meine ListView nur drei Ebenen an und kann darüber hinaus auch dann nicht erweitert werden, wenn die Struktur mehr verschachtelte Elemente enthält.

Hier ist mein Code:

public class RootAdapter extends BaseExpandableListAdapter { 

private UserObject root; 

private final LayoutInflater listLayoutInflater; 

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, UserObject root, ExpandableListView.OnGroupClickListener grpLst, 
        final ExpandableListView.OnChildClickListener childLst, ExpandableListView.OnGroupExpandListener grpExpLst) { 
    this.root = root; 
    this.listLayoutInflater = LayoutInflater.from(context); 

    lsfirst = new Entry[root.mChildren.size()]; 

    for (int i = 0; i < root.mChildren.size(); i++) { 
     final CustExpListview celv = new CustExpListview(context); 
     SecondLevelAdapter adp = new SecondLevelAdapter(root.mChildren.get(i),context); 
     celv.setLongClickable(true); 
     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 root.mChildren.get(groupPosition); 
} 

@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 UserObject getGroup(int groupPosition) { 
    return root.mChildren.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return root.mChildren.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 UserObject item = (UserObject) getGroup(groupPosition); 

    if (layout == null) { 
     layout = listLayoutInflater.inflate(R.layout.root_element, parent, false); 
     holder = new GroupViewHolder(); 
     holder.title = (TextView) layout.findViewById(R.id.rootTitle); 
     layout.setTag(holder); 
    } else { 
     holder = (GroupViewHolder) layout.getTag(); 
    } 

    holder.title.setText(item.mUserName.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; 
} 
} 

Und dann Adapter Implementierung des folgenden für meine zweite Ebene: in der Haupttätigkeit (dh Blattknoten)

public class SecondLevelAdapter extends BaseExpandableListAdapter { 

public UserObject child; 
Context mContext; 
LayoutInflater inflater; 

public SecondLevelAdapter(UserObject child,Context context) { 
    this.child = child; 
    this.mContext=context; 
    inflater = LayoutInflater.from(mContext); 
} 

@Override 
public UserObject getChild(int groupPosition, int childPosition) { 
    return child.mChildren.get(groupPosition).mChildren.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 UserObject item = (UserObject) 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.childTitle); 
     layout.setTag(holder); 
    } else { 
     holder = (ChildViewHolder) layout.getTag(); 
    } 

    holder.title.setText(item.mUserName.trim()); 

    return layout; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return child.mChildren.get(groupPosition).mChildren.size(); 
} 

@Override 
public UserObject getGroup(int groupPosition) { 
    return child.mChildren.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return child.mChildren.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 UserObject item = (UserObject) getGroup(groupPosition); 

    if (layout == null) { 
     layout = inflater.inflate(R.layout.root_element, parent, false); 
     holder = new ViewHolder(); 
     holder.title = (TextView) layout.findViewById(R.id.rootTitle); 
     layout.setTag(holder); 
    } else { 
     holder = (ViewHolder) layout.getTag(); 
    } 

    holder.title.setText(item.mUserName.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 diesen Code dann rufen:

public class Test extends navBar { 
private List<UserObject> mUserObjects; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View base = getLayoutInflater().inflate(R.layout.activity_admin__tool, frameLayout); 
    mUserObjects = new ArrayList<>(); 

    UserObject obj = new UserObject(); 
    obj.mChildren = new ArrayList<>(); 
    for(int i = 0;i<Constant.state.length;i++) { 
     root = new UserObject(); 
     root.mUserName = Constant.state[i]; 
     root.mChildren = new ArrayList<>(); 
     for (int j = 0; j < Constant.parent[i].length; j++) { 
      UserObject parent = new UserObject(); 
      parent.mUserName = Constant.parent[i][j]; 
      parent.mChildren = new ArrayList<>(); 
      for (int k = 0; k < Constant.child[i][j].length; k++) { 
       UserObject child = new UserObject(); 
       child.mUserName = Constant.child[i][j][k]; 
       UserObject test = new UserObject(); 
       test.mUserName = "test"; 
       child.mChildren.add(test); 
       parent.mChildren.add(child); 
      } 
      root.mChildren.add(parent); 
     } 
     obj.mChildren.add(root); 
    } 
    if (!obj.mChildren.isEmpty()) { 
     final ExpandableListView elv = (ExpandableListView) base.findViewById(R.id.expandableListView); 
    /* Item click listeners below */ 

     try { 
      // First level items in the ExpandableListView 
      elv.setLongClickable(true); 
      elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 
       @Override 
       public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition, 
              long id) { 
        ImageView tv = (ImageView) view.findViewById(R.id.rootImage); 
        if(!eListView.isGroupExpanded(groupPosition)){ 
         tv.setImageResource(R.drawable.ic_expand_less_black_24dp); 
        } 
        else 
         tv.setImageResource(R.drawable.ic_expand_more_black_24dp); 

        return false /* or true depending on what you need */; 
       } 
      }); 

      elv.setOnItemLongClickListener(new ExpandableListView.OnItemLongClickListener() { 
       @Override 
       public boolean onItemLongClick(AdapterView<?> parent, View childView, int flatPos, long id) { 
        if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 
         // do whatever you want with groupPos and childPos here - I used these to get my object from list adapter. 
         return false; 
        } 
        return true; 
       } 
      }); 

     } 
     catch (Exception e){ 
      Log.e("Admin_Tool",e.getMessage()); 
     } 
     // Second level items in the ExpandableListView 
     ExpandableListView.OnGroupClickListener grpLst = new ExpandableListView.OnGroupClickListener() { 
      @Override 
      public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition, 
             long id) { 
       ImageView tv = (ImageView) view.findViewById(R.id.rootImage); 
       if(!eListView.isGroupExpanded(groupPosition)){ 
        tv.setImageResource(R.drawable.ic_expand_less_black_24dp); 
       } 
       else 
        tv.setImageResource(R.drawable.ic_expand_more_black_24dp); 
       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, obj, grpLst, childLst, grpExpLst); 
     elv.setAdapter(adapter); 
    } 

} 

Schließlich oben gesetzt Konstanten wie folgt aus:

public class Constant { 
static String[] state = {"A","B","C"}; 
static String[][] parent = { 
     {"aa","bb","cc","dd","ee"}, 
     {"ff","gg","hh","ii","jj"}, 
     {"kk","ll","mm","nn","oo"} 
}; 

static String[][][] child = { 
     { 
       {"aaa","aab","aac","aad","aae"}, 
       {"bba","bbb","bbc","bbd","bbe"}, 
       {"cca","ccb","ccc","ccd","cce","ccf","ccg"}, 
       {"dda","ddb","dddc","ddd","dde","ddf"}, 
       {"eea","eeb","eec"} 
     }, 
     { 
       {"ffa","ffb","ffc","ffd","ffe"}, 
       {"gga","ggb","ggc","ggd","gge"}, 
       {"hha","hhb","hhc","hhd","hhe","hhf","hhg"}, 
       {"iia","iib","iic","iid","iie","ii"}, 
       {"jja","jjb","jjc","jjd"} 
     }, 
     { 
       {"kka","kkb","kkc","kkd","kke"}, 
       {"lla","llb","llc","lld","lle"}, 
       {"mma","mmb","mmc","mmd","mme","mmf","mmg"}, 
       {"nna","nnb","nnc","nnd","nne","nnf"}, 
       {"ooa","oob"} 
     } 
}; 
} 

Ich habe "Test" als Knoten zu allen Knoten der dritten Ebene hinzugefügt, um sicherzustellen, dass es für die vierte Ebene testen würde. Also wäre ein Beispiel a-> aa-> aaa-> test Test wird nie angezeigt, und aaa wird immer als der letzte Knoten behandelt. Wie gehe ich über drei Ebenen hinaus?

Antwort

2

Kasse diese Bibliothek: AndroidTreeView

In Abhängigkeit zu einem Projekt

compile 'com.github.bmelnychuk:atv:1.2.+' 

Erstelle deinen Baum

TreeNode root = TreeNode.root(); 

Fügen Sie Ihre Knoten (verwenden Sie Ihr benutzerdefiniertes Objekt als Konstruktor param)

TreeNode parent = new TreeNode("MyParentNode"); 
TreeNode child0 = new TreeNode("ChildNode0"); 
TreeNode child1 = new TreeNode("ChildNode1"); 
parent.addChildren(child0, child1); 
root.addChild(parent); 

Baumansicht zum Layout hinzufügen

AndroidTreeView tView = new AndroidTreeView(getActivity(), root); 
containerView.addView(tView.getView());