2013-08-11 10 views
10

Sto avendo un problema piuttosto strano. La mia logica è semplice, la mia app utilizza uno NavigationDrawer per la navigazione dell'applicazione principale e, a causa della complessità delle opzioni disponibili, desidero utilizzare uno ExpandableListViev per nidificare alcuni elementi di navigazione.ExpandableListView e NavigationDrawer

Il problema? Semplice: l'elenco degli articoli viene caricato nel cassetto; tuttavia, non si espandono per mostrare i bambini.

La domanda C'è qualche motivo per non espandersi? Dovrei usare un altro widget UI per questo?

Alcune note: ho aggiunto lo stesso codice su una diversa attività, ma invece di ospitare la ExpandableListViev sul cassetto, ho avuto aggiunto su un semplice LinearLayout come unico elemento, ed è funziona bene lì .

mio layout per l'attività:

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

il codice attività:

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

E infine una molto semplice adattatore:

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

La domanda ovvia sarebbe se si hanno valori in quegli array per i bambini (che immagino tu abbia :)). Vedo che imposti un 'OnGroupClickListener' sul tuo' ExpandableListView', spero tu stia restituendo 'false' dal callback' onGroupClick() 'di quel listener altrimenti bloccherai l'evento collapse/expand con un valore di ritorno di 'true' (significa che hai già gestito l'evento in modo che non siano necessarie altre azioni). – Luksprog

+0

Hmm, la documentazione non rende troppo ovvio che la restituzione di true bloccherebbe il collasso e l'espansione di default. È anche strano che ho applicato la stessa logica al di fuori del cassetto, e ha funzionato bene. Non sono a casa in quel momento, ma quello suona sicuramente come la soluzione giusta al mio problema, dal momento che sto ritornando vero su entrambi gli ascoltatori. Se vuoi, vai avanti e postalo come risposta, e quando torno a casa e torno a testare false, posso accettare la tua risposta. –

+0

Ogni articolo si espande/si contrae? O ne hai alcuni che si espandono e altri che rimangono semplici elementi cliccabili? – AlleyOOP

risposta

16

Come ho detto nel mio commento, fanno assicurati di restituire false dallo DrawerGroupClickListener impostato su ExpandableListView. Se si restituisce true dalla richiamata onGroupClick() del listener, verrà bloccata l'azione di compressione/espansione in quanto l'evento è considered handled.

+1

Sì, ha funzionato bene. Grazie! –

Problemi correlati