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;
}
}
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
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ź. –
Czy każdy element jest rozwijany/kontraktowany? A może masz coś, co się rozwija i inne, które pozostają prostymi klikalnymi przedmiotami? – AlleyOOP