实现滚动导航抽屉的最佳方式

时间:2015-05-06 18:14:03

标签: android android-listview scroll navigation-drawer

我一直在为我的某个应用添加导航抽屉,我开始想知道从导航抽屉使用ListView到多个TextView切换是否更好列出项目。查看Google Design Guidelines on Navigation Drawer content (specifically the section on 'Scrolling'),我注意到多个TextView可能看起来更好。

目前,我在导航抽屉中使用ListViewImageView(它看起来有点像this。但是,当我滚动导航抽屉时(我会这可以通过转换我的设备格局,因为我的列表中没有足够的项目),只有ListView滚动,而ImageView保持原样。我希望它能够更像{{ {3}}

此外,我发现导航抽屉中的ListView没有涟漪效果this, where the ImageView is also scrolled with the ListView,但我的其他ListView和{{1}中的其他Activity做的。

我面临的问题是什么?如何解决这些问题?

更新

在谷歌的I / O应用程序(2014年)中,as shown in this image的底部似乎有一个Fragment,我认为该LinearLayout负责显示的项目列表。有人可以解释这是如何工作的吗?

3 个答案:

答案 0 :(得分:4)

  

只有ListView滚动,ImageView保持原样

听起来您的抽屉顶部包含ImageView,然后是ListView。使用此配置时,只会ListView滚动(因为它是唯一可以滚动的视图)。

您需要将ImageView添加为始终位于列表开头的标题。正如其中一条评论建议,请listView.addHeaderView

  

导航底部似乎有一个LinearLayout   抽屉布局我认为负责项目清单   所示。有人可以解释这是如何工作的吗?

他们使用LinearLayout作为容器来容纳所有TextView s:

private void createNavDrawerItems() {
    mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list);
    ...
    int i = 0;
    for (int itemId : mNavDrawerItems) {
        mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer);
        mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]);
        ++i;
    }
}

我相信他们使用LinearLayout并以编程方式对所有项目进行充气的原因是可以轻松使用分隔符项目:

private View makeNavDrawerItem(final int itemId, ViewGroup container) {
    ...
    if (itemId == NAVDRAWER_ITEM_SEPARATOR) {
        layoutToInflate = R.layout.navdrawer_separator;
    } else if (itemId == NAVDRAWER_ITEM_SEPARATOR_SPECIAL) {
        layoutToInflate = R.layout.navdrawer_separator;
    } else {
        layoutToInflate = R.layout.navdrawer_item;
    }
    ...
    return view;
}

ListView中,您必须创建单独的项目类型并在那里使用分隔符的布局,这可能会变得更加繁琐。

乍一看,但是,这段代码似乎正在重新发明轮子,因为使用ListView可以实现所有这一切。

答案 1 :(得分:0)

截至2015年5月29日(在 Google I / O 2015 之后),您可以使用 Android设计支持库向您的应用添加NavigationView (S)。 Android Developer Blogspot article声明如下:

  

导航视图

     

navigation drawer可以成为您应用中身份和导航的重要焦点,这里的设计一致性可以让您的应用轻松导航,尤其是初次使用者。 NavigationView通过提供导航抽屉所需的框架以及通过菜单资源为导航项目充气的功能,使这更容易。

     

...

     

然后,您可以开始使用具有单个新依赖关系的设计库:
  function changeSlider(numslides) { var id_current = 1; var lastlength = 0; var lastlength_owner = 0; $(".slide").each(function() { var texth2 = $(this).children("h1").text(); var texth3 = $(this).children("h3").text(); var totallength = texth2.length + texth3.length; console.log(lastlength); console.log(totallength); if ( (lastlength > totallength) && (id_current == numslides) ) { console.log(totallength); changeSize(lastlength_owner); } if ( (lastlength < totallength) && (id_current == numslides) ) { console.log(totallength); $(".slider").css('height', $(this).height()); } if ( (lastlength < totallength) && (id_current !== numslides) ) { console.log(totallength); var lastlength = totallength; var lastlength_owner = $(this).attr('slide_id'); } id_current++; }); }

     

...

     

设计库,AppCompat和所有Android支持库是提供构建现代,外观漂亮的Android应用程序所需的构建块的重要工具,无需从头开始构建所有内容。

答案 2 :(得分:0)

使用android.support.v4.widget.DrawerLayout和NavigationView实现可滚动导航抽屉可能比在下面描述的更简单:http://android-developers.blogspot.ru/2015/05/android-design-support-library.html

该文章建议将应用程序导航抽屉的每个元素添加为菜单项。这很酷,绝对是大多数开发人员的一种方式。 但是如果你已经在例如内部实现了导航抽屉怎么办?线性布局?

看起来您可以轻松地将旧的好布局设置为可滚动:只需将其设置为NavigationView的“app:headerLayout”即可。不需要更改! 因此,在最终解决方案中,您将拥有:

您的活动的布局,类似于上面的博文,但没有“app:menu =”@ menu / drawer“属性,例如:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- your content layout -->

    <android.support.design.widget.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        />
</android.support.v4.widget.DrawerLayout>

“drawer_header.xml”文件中所有旧Drawer内容的布局,在不对此可滚动Drawer进行任何更改的情况下进行迁移,例如。这样:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    android:orientation="vertical">

    <TextView
        android:id="@+id/myFirstButton"
        android:onClick="onMyFirstButtonClick"
        android:text="@string/my_first_button_title"/>

    <TextView
        android:id="@+id/goToTheTopButton"
        android:onClick="onGoToTheTopButtonClick"
        android:text="@string/go_to_the_top_title"/>

    <View style="@style/Divider"/>

    <!-- Some other "menu items" -->
</LinearLayout>

有关完整的工作示例,请参阅此活动布局:https://github.com/andstatus/andstatus/blob/master/app/src/main/res/layout/timeline.xml和此提交,我将其迁移到可滚动的导航抽屉:https://github.com/andstatus/andstatus/commit/a80b299de714bdd65cacb138ffb31adc3ea23a98