以一种超简单方式实现recyclerview的item悬浮效果(可点击)

本片以提供思路为主

先看效果图:
Gif图不知道为啥不能循环播放,只播放了一遍,可以重新刷新界面看效果图
在这里插入图片描述

实现方式
1.RecyclerView.ItemDecoration

这一种可以实现Item的悬浮效果,像手机的通讯录
RecyclerView+index索引实现仿微信通讯录
城市选择列表等等

不过也有一些需求用ItemDecoration实现起来发而更麻烦,例如下面需求:
在这里插入图片描述

  1. 当前列表哪个item处于顶部,就悬浮哪个item(header是不需要悬浮的)
  2. 当前Item的ItemChild是不悬浮顶部的
  3. 悬浮item可点击,点击悬浮的item时,其item下的ItemChild列表,要是处于展开状态要让它关闭
    这是几个基本需求,要是用ItemDecoration实现就难搞了。

请看下面方式?:

2.借助于Rcyclerview的addOnScrollListener滑动监听

这种方式就非常简单了,不足的是它没有ItemDecoration的那种绘制不同item时的替换动画。

准备一个正常的Recyclerview列表和适配器

  1. XML编写时,Recyclerview所在的位置顶部编写一个Item的悬浮样式
    在这里插入图片描述
    至于具体样式是怎样排版,可以自己选择选择使用RelativeLayou、LinearLayout等等
  2. Rec设置addOnScrollListener监听,重写onScrolled方法
// 这里时默认展示有Header的代码
 rec.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                val manager = recyclerView.layoutManager
                if (manager != null && manager is LinearLayoutManager) {
                    var firstPosition = manager.findFirstVisibleItemPosition()
                    if (firstPosition == 0) {
                    /**
                        *  Header是recyclerview的一种类型处于第一个item
                        *  ,所以0,默认不展示悬浮item
                        * */
                        titlexx.visibility = View.GONE // 隐藏悬浮item
                        // 这一块的操作,要看你具体的业务需。
                        //(toUpTitle)我的项目中这一块是没要的。
                        //position=0时,这需要根据真实项目需求去调试的
                        toUpTitle(manager, firstPosition, adapter)
                    } else {
                    	// 这是pos>0情况
                        toUpTitle(manager, firstPosition, adapter)
                    }
                }
                 /**
                 * 提一点:有header情况
                 * 1.这里如果item有子列表,可能在非沉浸式的时候,上滑ItemB滑完此时ItemA展示,
                 * ItemA下的列表也是展示的,滑动列表ItemA下的子列表时,可能会出现悬浮Item还是ItemB
                 * 这里可以用判断是上滑还是下滑来处理这个悬浮Item更新问题
                 * 2.我自己的项目沉浸式 判断的top<0,是没有上述1的问题的,会在下方提出我项目中的代码。
                 * 
                 * 有这么个现象 给看官提个醒
                 * */
            }
        })

    private fun toUpTitle(manager: LinearLayoutManager, firstPosition: Int, adapter: Adapter) {
    	/**
    	*A__、这里利用当前pos的view,这里我是(firstPosition + 1)用取的下一个位置的view
    	*正常情况下是不用取的直接取firstPosition位置的view即可
    	*/
        val findViewByPosition = manager.findViewByPosition(firstPosition + 1)
        val top = findViewByPosition?.top// 获取据顶部的高度
        /**
        *这里注意下:这里需要各位写时,滑动列表打印这个值,
        *有head、无head、沉浸式、非沉浸式  这个值是不一样的,这个需要编写时自己取调试一下的
        */
        if (top!! < 130) {// 并不是固定的小于130
        	// 这个是跟A__、这块一样的道理
            val get = adapter.mlist.get(firstPosition + 1) // 获取当前处于顶部Item的数据
            // 展示悬浮Item
            titlexx.visibility = View.VISIBLE
            // 更新悬浮Item的数据
            titlexx.text = get.title
        }
    }

我自己项目中的代码:在这里插入图片描述

  1. 悬浮Item的点击事件
    这个逻辑简单就不细说了

如果对你有帮助点个赞吧!万分感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值