2013-08-11 21 views
10

Ich habe ein ziemlich seltsames Problem. Meine Logik ist einfach, meine App verwendet eine NavigationDrawer für Hauptanwendungsnavigation, und aufgrund der Komplexität der verfügbaren Optionen möchte ich eine ExpandableListViev verwenden, um einige Navigationselemente zu verschachteln.ExpandableListView und der NavigationDrawer

Das Problem? Einfach auch: Die Liste der Artikel lädt auf der Schublade; sie erweitern sich jedoch nicht, um den Kindern zu zeigen.

Die Frage Gibt es einen Grund, es würde nicht erweitern? Sollte ich ein anderes UI-Widget dafür verwenden?

Einige Anmerkungen: Ich habe den gleichen Code auf einer anderen Aktivität, sondern die ExpandableListViev auf die Schublade Hosting, ich hatte es auf einem einfachen LinearLayout als einziges Element hinzugefügt, und es funktioniert gut dort .

Mein Plan für die Aktivität:

<android.support.v4.widget.DrawerLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".MainActivity"> 
    <FrameLayout 
      android:id="@+id/content_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

<ExpandableListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@color/secondary_color_holo"/> 

</android.support.v4.widget.DrawerLayout> 

Der Code Aktivität:

private DrawerLayout mDrawerLayout; 
private ExpandableListView mDrawerList; 
private ExpandableDrawerAdapter mDrawerAdapter; 

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

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ExpandableListView) findViewById(R.id.left_drawer); 
    // set up the drawer's list view with items and click listener 
    mDrawerAdapter = new ExpandableDrawerAdapter(this); 
    mDrawerList.setAdapter(mDrawerAdapter); 
    mDrawerList.setOnGroupClickListener(new DrawerGroupClickListener()); 
    mDrawerList.setOnChildClickListener(new DrawerChildClickListener()); 
} 

Und schließlich ein sehr einfacher Adapter:

public class ExpandableDrawerAdapter extends BaseExpandableListAdapter { 

private static final int CAMPAIGNS = 0; 
private static final int CONVERSIONS = 1; 
private static final int MYACCOUNT = 2; 

private LayoutInflater mInflater; 
private String[] mainNavItems, campaignNavItems, myAccountNavItems; 

public ExpandableDrawerAdapter (Activity context) { 
    this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.mainNavItems = context.getResources().getStringArray(R.array.main_nav_items); 
    this.campaignNavItems = context.getResources().getStringArray(R.array.campaigns_nav_items); 
    this.myAccountNavItems = context.getResources().getStringArray(R.array.my_account_nav_items); 
} 

public Object getChild(int groupPosition, int childPosition) { 

    switch (groupPosition) { 
     case CAMPAIGNS: 
      return campaignNavItems[childPosition]; 
     case MYACCOUNT: 
      return myAccountNavItems[childPosition]; 
     default: 
      return ""; 
    } 
} 

public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.drawer_child_list_item, null); 
    } 

    TextView childText = (TextView) convertView.findViewById(R.id.drawer_child_list_item_text); 
    childText.setText((String) getChild(groupPosition, childPosition)); 

    return convertView; 
} 

public int getChildrenCount(int groupPosition) { 
    switch (groupPosition) { 
     case CAMPAIGNS: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + campaignNavItems.length); 
      return campaignNavItems.length; 
     case CONVERSIONS: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + 0); 
      return 0; 
     case MYACCOUNT: 
      Constants.logMessage("Children for group position: " + groupPosition + " are: " + myAccountNavItems.length); 
      return myAccountNavItems.length; 
     default: 
      return 0; 
    } 
} 

public Object getGroup(int groupPosition) { 
    return mainNavItems[groupPosition]; 
} 

public int getGroupCount() { 
    return mainNavItems.length; 
} 

public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

public View getGroupView(int groupPosition, boolean isExpanded, 
         View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.drawer_list_item, 
       null); 
    } 

    TextView groupText = (TextView) convertView.findViewById(R.id.drawer_list_item_text); 
    groupText.setText((String) getGroup(groupPosition)); 
    return convertView; 
} 

public boolean hasStableIds() { 
    return true; 
} 

public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 
} 
+1

Die offensichtliche Frage wäre, wenn Sie Werte in diesen Arrays für die Kinder haben (was ich denke, Sie haben :)). Ich sehe, dass Sie einen 'OnGroupClickListener' auf Ihrer' ExpandableListView' setzen, ich hoffe, dass Sie '' '' '' onGroupClick() 'Callback dieses Listeners zurückgeben, ansonsten werden Sie das Einblendungsereignis mit einem Rückgabewert von 'true' (was bedeutet, dass Sie das Ereignis bereits bearbeitet haben, sodass keine weiteren Aktionen erforderlich sind). – Luksprog

+0

Hmm, die Dokumentation macht es nicht zu offensichtlich, dass das Zurücksetzen von "True" den Standardzusammenbruch und -ausbau blockieren würde. Es ist auch seltsam, dass ich dieselbe Logik außerhalb der Schublade angewendet habe, und es hat gut funktioniert. Ich bin zu der Zeit nicht zu Hause, aber das klingt sicher nach der richtigen Lösung für mein Problem, da ich bei beiden Zuhörern wahr geworden bin. Wenn Sie möchten, gehen Sie voran und posten Sie es als eine Antwort, und sobald ich nach Hause komme und teste, falsch zurückkehrend, kann ich Ihre Antwort akzeptieren. –

+0

Wird jeder Gegenstand erweitert/kontrahiert? Oder haben Sie einige Erweiterungen und andere, die einfach anklickbare Elemente bleiben? – AlleyOOP

Antwort

16

Wie ich in meinem Kommentar sagte machen sicher, dass Sie false von der DrawerGroupClickListener, die Sie auf diesetzen zurückgeben 10. Wenn Sie true von der onGroupClick() Callback-Funktion des Listeners zurückgeben, wird die Aktion zum Reduzieren/Erweitern blockiert, da das Ereignis considered handled ist.

+1

Ja, das hat gut funktioniert. Vielen Dank! –

Verwandte Themen