如何使用新的设计库API正确隐藏和显示操作栏?

and*_*per 23 android android-listview android-fragments android-viewpager android-design-library

背景

假设我在活动中有这些元素:

  • 动作栏(实际上是工具栏)
  • 标签(使用TabLayout)
  • ViewPager,带有片段.
  • 每个片段都有ListVIew/RecyclerView.

我希望与许多应用程序具有相同的行为,滚动时,操作栏将隐藏或显示.

一个完美的例子是Play商店滚动的工作原理.

像这样的东西(但当然在片段中使用ListView):

在此输入图像描述

问题

我找到了" Android-ObservableScrollView "库,它显示了如何为许多类型的滚动视图执行此操作,但它不处理新TabLayout用法的情况(加上它有问题),如新样本所示,喜欢cheesesquare.

在设计库的新API(在"cheesesquare"示例中显示)上,它更加自动化,因此您无需创建如此多的样板来处理滚动以及如何处理它.

像这样的东西:

<android.support.v4.widget.DrawerLayout

  <android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

      <android.support.v7.widget.Toolbar
       app:layout_scrollFlags="scroll|enterAlways"/>

      <android.support.design.widget.TabLayout/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
     app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <android.support.design.widget.FloatingActionButton/>

  </android.support.design.widget.CoordinatorLayout>

  <android.support.design.widget.NavigationView/>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

这个雇佣小组承诺小吃店将位于FAB之下,并且动作栏将根据片段的内部RecyclerView自动生成动画(显示/隐藏).

事实上,这似乎只适用于RecyclerView,而不适用于ListView.

由于它们非常复杂,将它们转换为RecyclverViews非常困难.

这个问题

如何使上述机制也适用于ListViews?

有办法吗?如果是这样,怎么样?


编辑:遗憾的是,谷歌似乎不支持ListView的这种行为,但仅适用于RecyclerView和NestedScrollView(这里写的).

所以我尝试使用" Android-ObservableScrollView "库,但它有很多滚动问题,包括出现问题.

现在我决定给Android-ParallaxHeaderViewPager.任何人都可以告诉我如何使它在当前的情况下工作?它甚至可能吗?


编辑:毕竟我决定转换为RecyclerView.但是,我尝试过的所有示例都显示了一个问题:当停止滚动时,动作栏(甚至可能是FAB)可以保持截断状态,而不是游戏商店,它将被动画化为隐藏/显示.

编辑:当onScrollStateChanged具有IDLE时,我似乎需要使用setExpanded.问题是,如何决定何时扩展以及何时崩溃.

and*_*per 7

这是一个很好的解决方法,但它仍然与Play商店显示的非常不同:

对于每个片段,调用类似的东西:

    recyclerView.addOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            ((MainActivity) getActivity()).onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
            super.onScrolled(recyclerView, dx, dy);
            ((MainActivity) getActivity()).onScrolled(recyclerView, dx,dy);
        }
    });
Run Code Online (Sandbox Code Playgroud)

对于托管活动:

public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
    switch (newState) {
        case RecyclerView.SCROLL_STATE_IDLE:
            mAppBarLayout.setExpanded(mLastDy <= 0, true);
            mLastDy = 0;
            break;
    }
}

public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
    mLastDy = dy == 0 ? mLastDy : dy;
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果有人知道如何使它运行良好(使用ListView或RecyclerView作为片段),就像Play-Store和其他应用程序一样,请写下来.


Shr*_*jan 3

新设计API仅适用于新组件。如果该组件要支持旧版本,那么它必须适用于旧版本。

与您的问题相关: 我不知道您是否使用了建议的。但就我而言,它在这里效果很好。我知道它是一个非常古老的库,你必须使用 listview 。你不能用它来实现recyclerview。但由于我想要非常灵活和流畅的效果,所以我尝试了一下,效果很好。

您还可以使用列表视图滚动来平滑地滚动工具栏,并制作视差效果,如示例中所示。

请参阅此图片了解我为我的应用程序实现的效果。用红色标记是我的应用程序工具栏。

展开后的图像:

在此输入图像描述

折叠时的图像:

在此输入图像描述

如果您不想将列表视图更改为回收器视图,我建议您尝试使用该库来解决与操作栏相关的问题。但如果你想将列表视图更改为回收视图,那么你可以使用新的设计 API 来实现这种效果。

在这种情况下,请告诉我是否可以为您提供更多帮助。

真挚地,

施雷亚什

更新的答案

我认为你需要这样的东西。

如果这是你想要的,那么你应该引用这个并像这样实现。

请参阅第 1 部分、第 2 部分和第 3 部分以获得类似的效果。

需要帮助请叫我。