RecycleView 浮动条简单实现

工作中遇到一个需求,列表滚动时要把其中一个item 悬浮在手机屏幕顶部。搞android 好几年了,我对自定义view一般都是改别人的。

主要还是看需求,如果效果简单,组合几个view就可以达到效果,自己就顺手写了,如果自我感觉复杂一下,肯定baidu 改别人的。

 

先看看这个简单的效果:

《RecycleView 浮动条简单实现》

实现方式:

1:根据需求定位需要悬浮的item, 我这里是第二个条目。

2:定位停留位置:也就是悬浮在顶部,正好api有个方法

 linearManager.findFirstVisibleItemPosition(),可以定位到第一个可见条目。

3:在悬浮view位置覆盖一层相同的item。这个就需要在activity的布局中写。

4:注意Recycle所在的这个activity要用FrameLayout,也就是将recycleview和悬浮view 都放在

FrameLayout中。否则放在LinearLayout中会跳动,relativelayout 没有试。

5:监听悬浮view和item重合的时候,也就是findFirstVisibleItemPosition()==悬浮item的索引 。

当列表向上滚动时,findFirstVisibleItemPosition()和悬浮item的索引 重合时 ,停留固定悬浮view。

当列表向下滚动时,findFirstVisibleItemPosition()+1 和悬浮item的索引 重合时 ,隐藏悬浮view。


具体核心代码:首先将悬浮view隐藏

ll_floatview :表示悬浮view.

 ll_floatview.setVisibility(View.GONE);//首先将悬浮view隐藏
        recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                int firstVisible = linearManager.findFirstVisibleItemPosition();
                DebugUtil.e("dx:" + dx + "--dy:" + dy);
                DebugUtil.e("firstVisible" + firstVisible);

                if (dy > 0) {
                    //列表往上划动
                    if (firstVisible == 1) {
                        ll_floatview.setVisibility(View.VISIBLE);
                    }

                } else {
                    //列表往下划动
                    if (firstVisible == 0) {
                        ll_floatview.setVisibility(View.GONE);
                    }
                }




            }
        });

activity布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/default_background"
    android:orientation="vertical">

    <include layout="@layout/common_title_layout" />

<!-- 注意要用Framelayout-->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="visible" />

        </RelativeLayout>

        <LinearLayout
            android:id="@+id/ll_floatview"

            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/red"
            android:orientation="vertical">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:orientation="horizontal">

                <LinearLayout
                    android:id="@+id/ll_volunteering"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center">

                    <TextView
                        android:id="@+id/tv_volunteering"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="正在资助"

                        android:textColor="@color/color_55a8a8a8"
                        android:textSize="@dimen/text_size_16" />

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/ll_volunteered"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:gravity="center">

                    <TextView
                        android:id="@+id/tv_volunteered"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="已资助"
                        android:textColor="@color/text_color_585858"
                        android:textSize="@dimen/text_size_16" />

                </LinearLayout>
            </LinearLayout>

            <View
                android:id="@+id/tv_line"
                android:layout_width="120dp"
                android:layout_height="3dp"
                android:background="@color/yellow_FFA412" />

        </LinearLayout>


    </FrameLayout>

</LinearLayout>


RecycleView item布局:分为三种,其中TYPE_HEADER_2 就是要和悬浮view重合的布局

    final int TYPE_HEADER = 1;
    final int TYPE_HEADER_2 = 2;
    final int TYPE_ITEM = 3;

TYPE_HEADER_2 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/default_background"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/red"
        android:orientation="vertical">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:orientation="horizontal">

            <LinearLayout
                android:id="@+id/ll_volunteering"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center">

                <TextView
                    android:id="@+id/tv_volunteering"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="正在资助"

                    android:textColor="@color/color_55a8a8a8"
                    android:textSize="@dimen/text_size_16" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/ll_volunteered"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center">

                <TextView
                    android:id="@+id/tv_volunteered"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="已资助"
                    android:textColor="@color/text_color_585858"
                    android:textSize="@dimen/text_size_16" />

            </LinearLayout>
        </LinearLayout>

        <View
            android:id="@+id/tv_line"
            android:layout_width="120dp"
            android:layout_height="3dp"
            android:background="@color/yellow_FFA412" />

    </LinearLayout>


</LinearLayout>

    原文作者:niu0147
    原文地址: https://blog.csdn.net/niu0147/article/details/77945712
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞