本片以提供思路为主
先看效果图:
Gif图不知道为啥不能循环播放,只播放了一遍,可以重新刷新界面看效果图
实现方式
1.RecyclerView.ItemDecoration
这一种可以实现Item的悬浮效果,像手机的通讯录
RecyclerView+index索引实现仿微信通讯录
城市选择列表等等
不过也有一些需求用ItemDecoration实现起来发而更麻烦,例如下面需求:
- 当前列表哪个item处于顶部,就悬浮哪个item(header是不需要悬浮的)
- 当前Item的ItemChild是不悬浮顶部的
- 悬浮item可点击,点击悬浮的item时,其item下的ItemChild列表,要是处于展开状态要让它关闭
这是几个基本需求,要是用ItemDecoration实现就难搞了。
请看下面方式?:
2.借助于Rcyclerview的addOnScrollListener滑动监听
这种方式就非常简单了,不足的是它没有ItemDecoration的那种绘制不同item时的替换动画。
准备一个正常的Recyclerview列表和适配器
- XML编写时,Recyclerview所在的位置顶部编写一个Item的悬浮样式
至于具体样式是怎样排版,可以自己选择选择使用RelativeLayou、LinearLayout等等 - 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
}
}
我自己项目中的代码:
- 悬浮Item的点击事件
这个逻辑简单就不细说了
如果对你有帮助点个赞吧!万分感谢