可扩展列表视图和导航抽屉

10

我遇到了一个相当奇怪的问题。我的逻辑很简单,我的应用程序使用了一个NavigationDrawer作为主要应用程序导航,由于可用选项的复杂性,我想使用一个ExpandableListViev来嵌套一些导航项。

问题是什么?也很简单:项目列表在抽屉中加载,但它们不会展开显示其子项。

问题是:有什么原因它不会展开?我应该使用其他UI小部件吗?

一些注释:我在另一个活动中添加了相同的代码,但是我将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,
                         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
显而易见的问题是,如果您在这些数组中为子项设置了值(我猜您已经设置了:))。我看到您在ExpandableListView上设置了一个OnGroupClickListener,希望您从该侦听器的onGroupClick()回调中返回false,否则您将使用true作为返回值来阻止折叠/展开事件(意味着您已经处理了该事件,因此不需要其他操作)。 - user
嗯,文档并没有明确说明返回true会阻止默认的折叠和展开。同样奇怪的是,在抽屉之外应用相同的逻辑时,它运行良好。我现在不在家,但这肯定听起来像是解决我的问题的正确方法,因为我在两个监听器上都返回了true。如果您愿意,请将其发布为答案,一旦我回家并测试返回false,我就可以接受您的答案。 - daniel_c05
每个项目都会展开/收缩吗?还是有一些会展开,而其他的则保持简单的可点击项? - AlleyOOP
1个回答

17

正如我在评论中所说的,一定要确保在设置ExpandableListView上的DrawerGroupClickListener时返回false。如果从侦听器的onGroupClick()回调函数中返回true,将会阻止折叠/展开操作,因为该事件被认为是已处理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接