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

背景

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

  • 操作栏(实际上是一个工具栏)
  • 选项卡(使用TabLayout)
  • ViewPager,带有碎片。
  • 每个片段都有ListVIew / RecyclerView。

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

一个很好的例子就是Play商店的滚动function。

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

在这里输入图像说明

问题

我已经find了“ Android-ObservableScrollView ”库,它显示了如何为多种types的滚动视图做到这一点,但它不处理新的TabLayout使用情况(加上它有问题),如新样本所示,像cheesesquare

在devise库的新API(在“cheesesquare”示例中显示)上,它更自动化,因此您不需要创build太多的样板来处理滚动以及如何处理它。

类似的东西:

<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> 

这个请求者承诺,小吃店将在FAB下方,并且根据碎片的内部RecyclerView自动地动作(显示/隐藏)动作栏。

事情是,这似乎只适用于RecyclerView ,而不是与ListView。

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

这个问题

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

有没有办法做到这一点? 如果是这样,怎么样?


编辑:遗憾的是,谷歌似乎不会支持这种行为的ListView,但只为RecyclerView和NestedScrollView(写在这里 )。

所以我试图使用“ Android-ObservableScrollView ”库,但它有很多滚动问题,包括抛出问题。

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


编辑:我决定转换到RecyclerView毕竟。 然而,我尝试过的所有示例都显示了一个问题:在停止滚动时,操作栏(甚至可能是FAB)可能会被截断,而不是Play商店,在那里它将变成隐藏/显示的animation。

编辑:看来我需要使用setExpanded当有空的onScrollStateChanged。 问题是,如何决定什么时候扩大以及何时崩溃。

Solutions Collecting From Web of "如何正确隐藏和显示使用新的devise库API的操作栏?"

这是一个很好的解决方法,但与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); } }); 

主办活动:

 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; } 

不过,如果有人知道如何使它工作的很好(使用ListView或RecyclerView作为片段),就像在Play商店和其他应用程序,请写下来。

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

相关的问题:我不知道,你是否使用过build议的库 。 但是在我的情况下,这个效果很好。 我知道它是一个非常古老的图书馆,你必须使用listview。 你不能用这个来实现recyclerview。 但是,因为我想要有非常灵活和stream畅的效果,所以我尝试了一下,效果非常好。

您还可以使用Listview滚动来平滑滚动工具栏,并且还可以制作松弛效果,如示例中所示。

看到这个图像的效果,我已经实现了我的应用程序。 用红色标记是我的应用程序的工具栏。

图像展开时:

在这里输入图像说明

图像折叠时的图像:

在这里输入图像说明

如果你不想把你的listview改成recyclerview的话,我build议你去试试这个库。 但是如果你想改变你的listview到recyclerview,那么你可以使用新的deviseAPI来达到这个效果。

让我知道在这种情况下是否可以帮助你。

此致

Shreyash

更新了答案

我假设你需要像这样的东西。

如果这是你想要的,那么你应该不得不引用这个库和实现这样的。

Part1,Part2和Part3的效果相似。

需要帮助请叫我。

基于@android开发人员的解决scheme,有时展开应用程序栏时,完全滚动列表我做了一个小的变化扩大或倒塌列表取决于滚动的金额(如果它比头高,然后展开)。

 mHeaderHeight = getResources().getDimensionPixelSize(R.dimen.appbar_height); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: mAppBar.setExpanded(mScrolledAmount < mHeaderHeight , true); break; } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); mScrolledAmount += dy; } }); 

编辑:什么对我来说更好,是有不同的门槛扩大和崩溃

  switch (newState) { case RecyclerView.SCROLL_STATE_IDLE: if (mScrolledAmount < 50){ mAppBar.setExpanded(true , true); } if (mScrolledAmount > mHeaderHeight) { mAppBar.setExpanded(false, true); } break; }