2013-08-11 17 views
10

Mam dość dziwny problem. Moja logika jest prosta, moja aplikacja używa NavigationDrawer do nawigacji głównej aplikacji, a ze względu na złożoność dostępnych opcji, chcę użyć ExpandableListViev do zagnieżdżenia niektórych elementów nawigacyjnych.ExpandableListView i NavigationDrawer

Problem? Również proste: lista elementów ładowanych do szuflady; jednak nie rozszerzają się, aby pokazać dzieciom.

Pytanie Czy istnieje jakiś powód, dla którego nie rozszerzyłoby się? Czy powinienem używać do tego innego widżetu interfejsu użytkownika?

Kilka uwag: I dodaje ten sam kod na inną aktywność, ale zamiast gospodarzem ExpandableListViev na szufladzie, miałem to dodaje na prostym LinearLayout jako jedynego elementu, a to działa dobrze tam .

swojego układu za aktywność:

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

Kod aktywny:

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

I wreszcie bardzo prosty 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

Oczywiste pytanie brzmi, jeśli masz wartości w tablicach dla dzieci (które, jak sądzę, masz :)). Widzę, że ustawiłeś 'OnGroupClickListener' na swoim' ExpandableListView', mam nadzieję, że zwracasz 'false' z wywołania zwrotnego' onGroupClick() 'tego słuchacza, inaczej zablokujesz zdarzenie collapse/expand z wartością zwracaną "true" (co oznacza, że ​​już załatwiłeś zdarzenie, więc żadne inne działania nie są wymagane). – Luksprog

+0

Hmm, dokumentacja nie czyni zbyt oczywistym, że zwracanie wartości true blokowałoby domyślne zwijanie i rozwijanie. To również dziwne, że miałem tę samą logikę zastosowaną poza szufladą i działało to dobrze. Nie jestem wtedy w domu, ale to z pewnością brzmi jak właściwe rozwiązanie mojego problemu, ponieważ powracam do prawdy na obu słuchaczach. Jeśli chcesz, możesz napisać to jako odpowiedź, a kiedy wrócę do domu i przetestuję zwrot fałszywy, mogę przyjąć twoją odpowiedź. –

+0

Czy każdy element jest rozwijany/kontraktowany? A może masz coś, co się rozwija i inne, które pozostają prostymi klikalnymi przedmiotami? – AlleyOOP

Odpowiedz

16

Jak powiedziałem w moim komentarzu, należy upewnij się, że zwrócisz false z DrawerGroupClickListener ustawioną na ExpandableListView. Jeśli zwrócisz true z wywołania zwrotnego onGroupClick() odbiornika, zablokuje to działanie zwijania/rozwijania, ponieważ zdarzenie to jest considered handled.

+1

Tak, to działa dobrze. Dzięki! –

Powiązane problemy