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。在侦听器中,您检查onScrolledRecyclerView 的第一项是否在屏幕上。 如果第一项可见,首先将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 的滚动?

UIPageControl 似乎并不总是在滚动时发生变化

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

将 appbarLayout 放在屏幕底部