Android kotlin 用RecyclerView(androidx+BRVAH3.0.6)实现向上滑动隐藏标题栏向下滑动显示功能

一、实现效果

二、引入依赖

appbuild.gradle在添加以下代码
1、implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6',这个里面带的适配器,直接调用就即可

BaseRecyclerViewAdapterHelper简称BRVAH

Android SDK是否支持BaseRecyclerViewAdapterHelper:3.0.6
android compileSdkVersion 29
android compileSdkVersion 30
android compileSdkVersion 31
android compileSdkVersion 32
android compileSdkVersion 33

这依赖包还需要得到要添加,在Projectbuild.gradle在添加以下代码,不添加就不行

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }//加上
    }
}

三、实现源码

1、代码解析

1、主活动布局中标题栏

    <RelativeLayout
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_height"
        android:background="#4CAF50">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="标题栏 "
            android:textColor="#F44336"
            android:textSize="22sp" />
    </RelativeLayout>

在这里插入图片描述

2、RecyclerView的标题栏高度

recyclerView.translationY, resources.getDimension(R.dimen.title_height)

3、注意:主活动布局中和ListView的标题栏高度必须要一样

<dimen name="title_height">50dp</dimen>

2、适配器

RvAdapter.kt

package com.example.myapplication3.adapter

import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.example.myapplication3.R
import kotlinx.android.synthetic.main.item.view.*

class RvAdapter(layoutResId: Int = R.layout.item) :
    BaseQuickAdapter<String, BaseViewHolder>(layoutResId) {
    override fun convert(holder: BaseViewHolder, item: String) {
        holder.itemView.run {
            tv_content.text = item
        }
    }
}

item布局item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_menu_layout"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="#e9e9e9">

    <RelativeLayout
        android:id="@+id/ll_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <!--也可以是复杂的item布局-->
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
</RelativeLayout>

3、实现视图

MainActivity.kt

package com.example.myapplication3

import android.animation.Animator
import android.animation.ObjectAnimator
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.myapplication3.adapter.RvAdapter
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    var list = ArrayList<String>()

    private var mTouchSlop = 0
    private var mFirstY = 0f
    private var mCurrentY = 0f

    private val mAdapter by lazy {
        RvAdapter()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mTouchSlop = ViewConfiguration.get(this@MainActivity).scaledTouchSlop
        init()
        showHideTitleBar(true);
    }

    private fun init() {
        val layoutManager = LinearLayoutManager(this@MainActivity)
        layoutManager.orientation = LinearLayoutManager.VERTICAL
        recyclerView.layoutManager = layoutManager
        recyclerView.adapter = mAdapter

        for (i in 0..50) {
            list.add("第 ${i + 1} 行")
        }

        mAdapter.setList(list)

        recyclerView.setOnTouchListener(View.OnTouchListener{ v, event ->
            when(event.action){
                MotionEvent.ACTION_DOWN -> {
                    mFirstY = event.y
                }
                MotionEvent.ACTION_MOVE -> {
                    mCurrentY = event.y
                    if (mCurrentY - mFirstY > mTouchSlop) {

                        // 下滑 显示titleBar
                        showHideTitleBar(true)
                    }else if (mFirstY - mCurrentY > mTouchSlop){

                        // 上滑 隐藏titleBar
                        showHideTitleBar(false)
                    }
                }
                MotionEvent.ACTION_UP ->{

                }
            }
            return@OnTouchListener false
        })
    }

    private var mAnimatorTitle: Animator? = null
    private var mAnimatorContent: Animator? = null

    private fun showHideTitleBar(tag: Boolean) {
        if (mAnimatorTitle != null && mAnimatorTitle!!.isRunning) {
            mAnimatorTitle!!.cancel()
        }
        if (mAnimatorContent != null && mAnimatorContent!!.isRunning) {
            mAnimatorContent!!.cancel()
        }
        if (tag) {
//            mAnimatorTitle = ObjectAnimator.ofFloat(rl_title, "translationY", rl_title.getTranslationY(), 0)

            mAnimatorTitle = ObjectAnimator.ofFloat(rl_title, "translationY", rl_title.translationX,0f)

//            mAnimatorContent = ObjectAnimator.ofFloat(recyclerView, "translationY", recyclerView.getTranslationY(), getResources().getDimension(R.dimen.title_height))
            mAnimatorContent = ObjectAnimator.ofFloat(recyclerView, "translationY", recyclerView.translationY, resources.getDimension(R.dimen.title_height))

        } else {
//            mAnimatorTitle = ObjectAnimator.ofFloat(rl_title, "translationY", rl_title.getTranslationY(), -rl_title.getHeight())
            mAnimatorTitle = ObjectAnimator.ofFloat(rl_title, "translationY", rl_title.translationY, -resources.getDimension(R.dimen.title_height))

//            mAnimatorContent = ObjectAnimator.ofFloat(recyclerView, "translationY", recyclerView.getTranslationY(), 0)
            mAnimatorContent = ObjectAnimator.ofFloat(recyclerView, "translationY", recyclerView.translationY, 0f)

        }
        mAnimatorTitle!!.start();
        mAnimatorContent!!.start();
    }

//    public class MainActivity extends AppCompatActivity {
//
//        private RelativeLayout mTitle;
//        ArrayList<String> list = new ArrayList<String>();
//        ArrayAdapter adapter;
//        private ListView mListView;
//        private int mTouchSlop;
//        private float mFirstY;
//        private float mCurrentY;
//
//        @Override
//        protected void onCreate(Bundle savedInstanceState) {
//            super.onCreate(savedInstanceState);
//            requestWindowFeature(Window.FEATURE_NO_TITLE);
//            setContentView(R.layout.activity_main);
//            mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
//
//            initViews();
//            showHideTitleBar(true);
//        }
//
//        private void initViews() {
//            mListView = (ListView) findViewById(R.id.listview);
//            mTitle = (RelativeLayout) findViewById(R.id.title);
//
//            for (int i = 0; i < 100; i++) {  //设置数据
//            list.add("第  " + (i + 1) + "  行");
//        }
//
//            adapter = new ArrayAdapter(this, android.R.layout.activity_list_item, android.R.id.text1, list);
//            mListView.setAdapter(adapter);
//            mListView.setOnTouchListener(new View.OnTouchListener() {
//
//                @Override
//                public boolean onTouch(View v, MotionEvent event) {
//                    switch (event.getAction()) {
//                        case MotionEvent.ACTION_DOWN:
//                        mFirstY = event.getY();
//                        break;
//                        case MotionEvent.ACTION_MOVE:
//                        mCurrentY = event.getY();
//                        if (mCurrentY - mFirstY > mTouchSlop) {
//                            System.out.println("mtouchislop:" + mTouchSlop);
//                            // 下滑 显示titleBar
//                            showHideTitleBar(true);
//                        } else if (mFirstY - mCurrentY > mTouchSlop) {
//                            // 上滑 隐藏titleBar
//                            showHideTitleBar(false);
//                        }
//                        break;
//                        case MotionEvent.ACTION_UP:
//                        break;
//                    }
//                    return false;
//                }
//            });
//        }
//
//        private Animator mAnimatorTitle;
//        private Animator mAnimatorContent;
//
//        private void showHideTitleBar(boolean tag) {
//            if (mAnimatorTitle != null && mAnimatorTitle.isRunning()) {
//                mAnimatorTitle.cancel();
//            }
//            if (mAnimatorContent != null && mAnimatorContent.isRunning()) {
//                mAnimatorContent.cancel();
//            }
//            if (tag) {
//                mAnimatorTitle = ObjectAnimator.ofFloat(mTitle, "translationY", mTitle.getTranslationY(), 0);
//                mAnimatorContent = ObjectAnimator.ofFloat(mListView, "translationY", mListView.getTranslationY(), getResources().getDimension(R.dimen.title_height));
//
//            } else {
//                mAnimatorTitle = ObjectAnimator.ofFloat(mTitle, "translationY", mTitle.getTranslationY(), -mTitle.getHeight());
//                mAnimatorContent = ObjectAnimator.ofFloat(mListView, "translationY", mListView.getTranslationY(), 0);
//            }
//            mAnimatorTitle.start();
//            mAnimatorContent.start();
//        }
//    }
}

代码中:return@OnTouchListener false 设置成true,列表第一行就一直滑到顶部下面,不是超顶部屏障,如下图:

activity_main.xml

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

    <RelativeLayout
        android:id="@+id/rl_title"
        android:layout_width="match_parent"
        android:layout_height="@dimen/title_height"
        android:background="#4CAF50">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="标题栏 "
            android:textColor="#F44336"
            android:textSize="22sp" />
    </RelativeLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬sir哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值