AppBarLayout 并不总是在向下滚动时重新输入
Posted
技术标签:
【中文标题】AppBarLayout 并不总是在向下滚动时重新输入【英文标题】:AppBarLayout does not always re-enter on scroll down 【发布时间】:2016-02-28 20:42:13 【问题描述】:我在 CoordinatorLayout 和 RecyclerView 中使用 AppBarLayout、CollapsingToolbarLayout 创建了一个可折叠的透明搜索栏。让 recyclerView 出现在 appBarLayout 后面而不是在它下面有点(很多)棘手;但正在工作。我的问题是,有时,当我向下滚动时,应用栏不会重新进入。我只是在屏幕外保持隐形。这是我的布局:
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
android:layout_
android:layout_
android:fitsSystemWindows="true"
app:expandedTitleMarginBottom="88dp">
<android.support.v7.widget.RecyclerView
android:id="@+id/services_recycler_view"
android:orientation="vertical"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:behavior_overlapTop="88dp">
</android.support.v7.widget.RecyclerView>
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_
android:layout_
android:fitsSystemWindows="true"
android:background="@color/color_transparent"
app:elevation="0dp">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_
android:layout_
app:layout_scrollFlags="scroll|enterAlways"
android:fitsSystemWindows="false">
<Button
android:layout_
android:layout_
android:text="Search Location or Service"
android:id="@+id/button_search_bar"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
对解决不重新进入问题的任何帮助都会很棒。
还有一个问题,因为我使用app:behavior_overlapTop="88dp"
使recyclerView 出现在应用栏后面,所以整个滚动有点奇怪:它从滚动appBar 开始,然后滚动recycler 视图。欢迎任何更好的解决方案。
编辑: 我意识到 AppBar 实际上在向下滚动时重新输入但不可见(我可以点击它,我只是看不到它)。我想我会分享这个新线索 =)
【问题讨论】:
RecyclerView 的可见性消失是有原因的吗? 是的,对不起,我将删除它,它不属于这里。它是旧版本视图的一部分。加载我的项目后,我在代码中处理它。 你是怎么解决这个问题的? 【参考方案1】:这不是我只想确认您给出的答案的答案,它看起来像这样??向上滚动时
表示搜索按钮会出现在最前面?
编辑:
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_
android:layout_
android:fitsSystemWindows="false"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
添加 exitUntilCollapsed 标志。
【讨论】:
搜索按钮必须在向上滚动时完全消失并在向下滚动时重新输入。当搜索按钮可见时,列表也必须在其后面可见。搜索栏必须覆盖列表。所以你展示的不是我想要的。 它不会改变任何东西。现在我已经开始支持 v 23.1.1 和构建工具 23.0.2,重叠不再起作用。我已经从头开始构建自己的实现,它更好。我将保持赏金开放,看看是否有其他人感兴趣并可以提供更多信息。但如果没有人想要,请在 2 天内提醒我给你。【参考方案2】:经过几个小时的反复试验,我设法找到了解决您问题的方法。您可以将OnScrollListener
设置为您的RecyclerView
。在侦听器中,您检查onScrolled
中RecyclerView
的第一项是否在屏幕上。
如果第一项可见,首先将AppBarLayout
的可见性更改为View.INVISIBLE
,然后将其直接更改回View.VISIBLE
。
您的代码可能如下所示(Kotlin):
override fun onCreate(savedInstanceState : Bundle?)
super.onCreate(savedInstanceState)
contentView(R.layout.my_activity)
val mAppbar = appbar
val mServices_recycler_view = services_recycler_view
//...
mServices_recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener()
override fun onScrollStateChanged(recyclerView : RecyclerView, newState : Int)
super.onScrollStateChanged(recyclerView, newState)
override fun onScrolled(recyclerView : RecyclerView, dx : Int, dy : Int)
val layoutManager = LinearLayoutManager::class.java.cast(recyclerView.layoutManager)
if(layoutManager.findFirstVisibleItemPosition() == 0)
mAppbar.visibility = View.INVISIBLE
mAppbar.visibility = View.VISIBLE
我知道这不是很漂亮,但只要它解决了我不介意的问题。
此外,您希望改进检查RecyclerView
的第一项是否显示,这样它就不会在您每次滚动时触发,即使只是一点点。
您在问题中描述的布局不必更改。
【讨论】:
以上是关于AppBarLayout 并不总是在向下滚动时重新输入的主要内容,如果未能解决你的问题,请参考以下文章
Android CoordinatorLayout + AppbarLayout + Viewpager 总是滚动
使用 RecyclerView + AppBarLayout
如何在 CoordinatorLayout 中禁用 AppBarLayout 的滚动?