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;
}
}
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
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. –
Wird jeder Gegenstand erweitert/kontrahiert? Oder haben Sie einige Erweiterungen und andere, die einfach anklickbare Elemente bleiben? – AlleyOOP