我有一个很奇怪的问题.我的逻辑很简单,我的应用程序使用NavigationDrawer进行主应用程序导航,并且由于可用选项的复杂性,我想使用ExpandableListViev来嵌套一些导航项.
问题?简单:项目列表载入抽屉;然而,他们不扩大展示孩子们.
问题有什么理由不会扩大吗?我应该使用不同的UI小部件吗?
一些注释:我在一个不同的Activity上添加了相同的代码,而不是在抽屉上托管ExpandableListViev,而是把它添加到一个简单的LinearLayout上,作为唯一的元素,它在那里工作得很好.
我的活动布局:
<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>
活动代码:
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()); }
最后一个非常简单的适配器:
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,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; } }
解决方法
正如我在评论中所说的那样,请确保从您在ExpandableListView上设置的DrawerGroupClickListener返回false.如果从监听器的onGroupClick()回调中返回true,则会在事件为
considered handled时阻止collapse / expand操作.