web-dev-qa-db-de.com

Wie lassen sich mehr als drei Ebenen der erweiterbaren Listenansicht anzeigen?

Wie man mehr als drei Ebenen der erweiterbaren Listenansicht anzeigt, bekomme ich nur Beispiele für erweiterbare 3-Ebenen.

Verweisen auf diese: Drei-Ebenen-erweiterbare Liste

In diesem Beispiel fügt er eine weitere Expandable-Liste in der getChildView-Methode von ParentLevel BaseExpandableListAdapter hinzu: 

CustExpListview SecondLevelexplv = new CustExpListview(Home.this);
SecondLevelexplv.setAdapter(new SecondLevelAdapter());

SecondLevelexplv.setGroupIndicator(null);   
return SecondLevelexplv;

so ähnlich Ich bin Hinzufügen einer weiteren Expandable-Liste in der getChildView-Methode von SecondLevelAdapter.

Seine Arbeitsweise, aber die Ansicht kommt nicht wie 3-Stufen der erweiterbaren Listenansicht .. und ich habe diese gelesen:

3-stufige erweiterbare Listenansicht mit Swipe-Funktion

Multi-Level-Erweiterungsliste-in-Android

Problem-mit-Erweiterungs-Multi-Level-Erweiterungslistenansicht

Bitte geben Sie mir ein geeignetes Beispiel für ein auf mehreren Ebenen erweiterbares Display in Android.

Vielen Dank,

19
Cropper

Ich habe eine Lösung gefunden und lade alle Java-Klassen hoch. Überprüfen Sie also, ob Java oder Sie dieses überprüfen können:

1: Hauptaktivität.Java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Object  obj = new Object();
    obj.children =  new ArrayList<Object>();
    for(int i = 0;i<Constant.state.length;i++)
    {
        Object root =  new Object();
        root.title = Constant.state[i];
        root.children =  new ArrayList<Object>();
        for(int j=0;j<Constant.parent[i].length;j++)
        {
             Object parent =  new Object();
             parent.title=Constant.parent[i][j];
             parent.children =  new ArrayList<Object>();
             for(int k=0;k<Constant.child[i][j].length;k++)
             {
                 Object child =  new Object();
                 child.title =Constant.child[i][j][k];
                 parent.children.add(child);
             }
             root.children.add(parent); 
        }
        obj.children.add(root);
    }

    if (!obj.children.isEmpty()) {
        final ExpandableListView elv = (ExpandableListView) findViewById(R.id.expList);

        elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                    int groupPosition, long id) {

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


        ExpandableListView.OnGroupClickListener grpLst = new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView eListView, View view, int groupPosition,
                    long id) {

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


        ExpandableListView.OnChildClickListener childLst = new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView eListView, View view, int groupPosition,
                    int childPosition, long id) {

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

        ExpandableListView.OnGroupExpandListener grpExpLst = new ExpandableListView.OnGroupExpandListener() {
            @Override
            public void onGroupExpand(int groupPosition) {

            }
        };

        final RootAdapter adapter = new RootAdapter(this, obj, grpLst, childLst, grpExpLst);
        elv.setAdapter(adapter);
}


}
 }

2: Object.Java

public class Object {
public String title; // use getters and setters instead
public List<Object> children; // same as above

public Object() {
    children = new ArrayList<Object>();
}
}

3: RootAdapter.Java

public class RootAdapter extends BaseExpandableListAdapter {

private Object root;

private final LayoutInflater inflater;

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;

public RootAdapter(Context context, Object root, ExpandableListView.OnGroupClickListener grpLst,
    ExpandableListView.OnChildClickListener childLst, ExpandableListView.OnGroupExpandListener grpExpLst) {
    this.root = root;
    this.inflater = LayoutInflater.from(context);

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

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

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

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

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

4: SecondLevelAdapter.Java

public class SecondLevelAdapter extends BaseExpandableListAdapter {

public Object child;
Context mContext;
LayoutInflater inflater;

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

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

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

    return layout;
}

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

@Override
public Object getGroup(int groupPosition) {
    return child.children.get(groupPosition);
}

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

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

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

}

5 Constant.Java

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

5: item_parent.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:paddingLeft="10dp" >

<TextView
    Android:id="@+id/itemParentTitle"
    Android:layout_width="0dp"
    Android:layout_weight="1"
    Android:layout_height="wrap_content"
    Android:layout_marginLeft="5dp"
    Android:layout_marginRight="5dp"
    Android:background="#5ccccc"
    Android:padding="2dp"
    Android:textColor="#006363"
    Android:textSize="20sp" />

<ImageView
    Android:id="@+id/itemParentImage"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

</LinearLayout>
22
Cropper
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    // 999999 is a size in pixels. 
    // ExpandableListView requires a maximum height in order to do measurement calculations.
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

das macht die Länge viel sinnvoller.

2
Alp Altunel

Die Verwendung der Listenansicht für verbrauchbare Materialien und die Erstellung eines zweiten Verbrauchsadapters ist ein Weg, der nicht empfohlen wird, da dies die gesamten Prozesse kompliziert macht. Es gibt einen einfachen Weg, indem verschiedene Ansichten mithilfe von Bildlaufansichten und linearem Layout aufgeblasen werden.

2
Nouman Shah
public class CustExpListview extends ExpandableListView {

    public CustExpListview(Context context) {
        super(context);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(600, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDetachedFromWindow() {
        try {
            super.onDetachedFromWindow();
        } catch (IllegalArgumentException e) {
            // TODO: Workaround for
            // http://code.google.com/p/Android/issues/detail?id=22751
        }
    }
}
0
user2702578