支持吸顶Sticky,滚动布局NestedScrollView嵌套RecyclerView,解决CoordinatorLayout、AppBarLayout快速滑动fling停住卡住回弹抖动等bug

Overview

前言

作为ConsecutiveScroller使用者首先感谢作者提供这个库,但是这个控件有个不能继续使用bug,一直未能没修复,

#80 严重影响了用户体验

虽然评论区我提供了CoordinatorLayout+CollapsingToolbarLayout+AppBarLayout$ScrollingViewBehavior+minHeight(吸顶)解决方案。但是依然不够完美,

首先没有作者这个库ConsecutiveScroller能支持多个吸顶布局。

第二也是非常讨厌的问题在AppBarLayout的视图里面上下滑动,滑动过程会停止一下,这个列表滑动的操作不连续,当然这个问题只有在AppBarLayout的视图非常大的时候才会发现。

我还有一个解决方案就是全部用RecyclerView多布局类型来做,然后重写ItemDecoration来实现吸顶功能,但是这种吸顶使用复杂,还存在视图回收在回来需要重新绑定数据的这种问题。

虽然我不想重复造轮子,但是逼不得已。于是下面这个新的库出现了。

简介

StickyHeaderScrollView是Android下支持吸顶Sticky,滚动布局NestedScrollView嵌套RecyclerView,解决CoordinatorLayout、AppBarLayout快速滑动fling停住卡住回弹抖动等bug。

StickyHeaderScrollView支持NestedScrolling机制。

效果图

滚动布局NestedScrollView嵌套RecyclerView
NestedScrollView嵌套ViewPager2
device-2021-06-03-175146.gif

支持SwipeRefreshLayout下拉刷新
动态改变布局不影响吸顶
device-2021-06-03-175146 (1).gif

使用文档

<?xml version="1.0" encoding="utf-8"?>
<com.kongnan.headerscrollview.HeaderScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <com.kongnan.headerscrollview.StickyLinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <!-- 布局省略 -->

            <TextView
                android:id="@+id/remove_view"
                android:layout_width="match_parent"
                android:layout_height="80dp"
                android:background="@android:color/background_dark"
                android:text="吸顶View-1"
                android:textColor="@color/purple_200"
                app:isSticky="true" />

           <!-- 布局省略 -->

        </com.kongnan.headerscrollview.StickyLinearLayout>

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>
</com.kongnan.headerscrollview.HeaderScrollView>

就是如此简单,详细使用请看Demo

LICENSE

没有使用协议,两个类HeaderScrollView和StickyLinearLayout拿去随便用。

掘金

欢迎评论区讨论 https://juejin.cn/post/6969759148862865415/

You might also like...
Comments
  • 高度丢失!!

    高度丢失!!

    <com.example.common.widget.stick.HeaderScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    打开页面,直接显示的是带有吸顶的那个高度,需要往下滑才出现150的高度

        <com.example.common.widget.stick.StickyLinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView
                android:background="#f00f00ee"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_150">
    
            </TextView>
    
            <LinearLayout
                android:background="#e9573f"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_65"
                android:gravity="center_vertical"
                app:isSticky="true"
                android:orientation="horizontal">
    
    opened by 429329513wanting 3
  • header移除bug

    header移除bug

    当StickyLinearLayout中只有一个sticky控件且被移除时,minimumHeight 会被保留,没有重置

        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
            for (i in childCount - 1 downTo 0) {
                val child = getChildAt(i)
                if ((child.layoutParams as LayoutParams).isSticky) {
                    minimumHeight = child.measuredHeight
                    break
                }
            }
        }
    
        override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec)
            var minHeight = 0
            for (i in childCount - 1 downTo 0) {
                val child = getChildAt(i)
                if ((child.layoutParams as LayoutParams).isSticky) {
                    minHeight = child.measuredHeight
                    break
                }
            }
            minimumHeight = minHeight
        }
    
    opened by daydreamnist 1
  • 布局中有banner,当滑动到最底部的时候,viewpager内的fragment布局过几秒后会自动往回顶是什么问题呢?

    布局中有banner,当滑动到最底部的时候,viewpager内的fragment布局过几秒后会自动往回顶是什么问题呢?

    在Activity中正常,在fragment中就会出现这个问题.布局是这样的:

    <com.kongnan.headerscrollview.HeaderScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <com.gxhy.oct.StickyLinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/tl_home"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@android:color/holo_red_dark"
                android:gravity="center_vertical"
                android:text="吸顶View-2"
                android:textColor="@color/black"
                android:textSize="22sp"
                app:isSticky="true" />
    
            <com.to.aboomy.pager2banner.Banner
                android:id="@+id/banner_home"
                android:layout_width="match_parent"
                android:layout_height="160dp" />
    
            <com.flyco.tablayout.SlidingTabLayout2
                android:id="@+id/stl_home"
                android:layout_width="match_parent"
                android:layout_height="@dimen/dp_40"
                app:isSticky="true"
                app:layout_constraintTop_toTopOf="parent"
                app:tl_indicator_color="#BE9B54"
                app:tl_indicator_width="20dp"
                app:tl_tab_space_equal="true"
                app:tl_textBold="SELECT"
                app:tl_textSelectColor="#BE9B54"
                app:tl_textUnselectColor="#999999"
                app:tl_textsize="15sp" />
    
        </com.gxhy.oct.StickyLinearLayout>
    
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/vp_home"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    </com.kongnan.headerscrollview.HeaderScrollView>

    opened by roybill 1
Owner
孔楠
Android Technical Manager
孔楠