都2021了,RecyclerView嵌套滑动置顶应该现已被说烂了吧,但是假定项目中真的需求一个这样的结构使用到主页,想找到一个老到的计划并不简略。这篇文章给出的是已安稳工作大半年的嵌套滑动代码。

代码地址:ByRecyclerView / stickyrv

作用图

RecyclerView嵌套滑动置顶 项目使用篇

  • 点我下载体验

项目来历

半年前接到的任务需求将主页改为天猫或京东的相同,现在好像滑动置顶都是标配了,之前android的drawable类在网上看到那么多这类似的文章,找找应该不难,作用我简直找遍了全部的文章Android与项目底子都不能运用,有卡android手机顿的bug,问作者有没有使用到项目中也没有回应。

原本想像曾经的滑动置顶运用applicationCoordinatorLayout+TabLayout+RecyclerView的办法处理,但是感觉欠妥,用uiautAndroidomatorviewer剖析了天猫/京东/网易考拉全部Apapp装置下载p的主页都是运用的RecyclerViewViewPagerRecyclerapp装置下载View的办法,apple然后持续寻觅时发现了一个开源众包最接近的项目 xmuSistone/PersistentRecyclerView。这应该是我找过的最完善的代码,然后使用到实践项目中发现仍是有问题:开源节流

  • 1.在华为设备上滑动子RecyclerView时会有跳动
  • 2.父RecyclerVieandroid手机w下拉改写运用的是SmartRefreshLayout有issues反应有卡顿
  • 3.子RecyclerView加载更多需求处理
  • 4.子RecyclerView嵌套横向的RecyclerView滑动抵触问题
  • 5.Android4.4惯性滑动溃散问题

当然轮子不可能完美贴合项开源节流目的需求,所以在上面批改了部分代码。

完善

1.在华为设备上滑动子RecyclerView时会有跳动

这个问题我在好几个作者写的滑动置顶代码那里都发现了,其他开源是什么意思手机都是没问题的,原因是华为设备灵敏度很高,在手指放在ChildRecyclerView时很简略触发parent.reques开源节流是什么意思是什么tDisallowInterceptTouchEvent(false)将事情丢给ParentRecyclerView,然后导致卡顿。处理办法是在dispatchTouchEventandroidstudio装置教程里假定笔直滑动的间隔逾越24f才丢给ParentRecyclerView
开源节流是什么意思是什么体代码:

override fun dispatchTouchEvent(e: MotionEvent): Boolean {
val x = e.rawX
val y = e.rawY
whe开源众包n (e.action) {
MotionEvent.ACTION_DOWN -> {
//将按下时的坐标存储
downX = x
downY = y
// true 表示让ParentRecyclerView不要阻遏
parent.requeandroid平板电脑价格s开源节流是什么意思是什么tDisallowInterceptTouchEvent(true)
}
MotionEvent.ACTION_MOVE -> {
//获取到间隔差
val dx: Float = x - downX
val dy: Float = y - downY
// 通android/yunos过间隔差判别方向
val orientatioandroid平板电脑价格n = getOrientation(dx, dy)
val location = intArrayOf(0, 0)
getLocationOnScreen(location)
when (orientation) {
"d" -> if (canScroapprovellVertically(-1)) {
// 能够向下滑动android的drawable类时让ParentRecyclerView不要阻遏
parent.requestDisallowInterceptTouchEvent(true)
} else { //内层开源阅读RecyclerView下拉到最顶部时
if(dy < 24f){
// 假定滑动的间隔小于这个值仍然让Parent不阻遏
parent.reque开源众包stDis开源众包allowInterceptandroid下载TouchEvent(true)
}else{
// 将滑动事情抛给Parent,这样能够跟着Parent一同滑动
parent.requestDisallowInterceptTouchEvent(false)
}
}
"u" -> {
// 向上滑动时,一向由ChildRecyclerView处理
parent.requestDisallowInterceptTouchEvent(true)
}
}
}
}
return super.dispatchTouchEvent(e)
}
private fun getOrientation(dx: Fl开源是什么意思oat, dy: Float): String {
return if (Mandroid下载ath.abs(dx) > Math.abs(dyappreciate)) {
//X轴移动
if (dx > 0) "r" else "l" //右,左
} else {
//Y轴移动
if (dy > 0) "d" else "u"开源节流是什么意思是什么 //下//上
}
}

2.处理下拉改写/上拉appreciate加载问题(问题2/3)

由于之前花了一番功夫写了 ByRecyclerView,支持下拉改写和上拉加载,其本质上就是Adapteandroid什么意思r上加一个特appointment其他viewType来处理,所带来的兼容性也好许多,所以将Baseandroid平板电脑价格RecyclerView继承Byandroid下载装置RecyclerView后就达到了要求,给ParentRecy开源阅读app下载装置clerViewChildRecyc开源阅读lerView分别加下拉改写和上拉加载的监听就好了:

parentRecyclerView.setOnRefreshListener { }
childRecyclerView.setOnapplicationLoadMore开源节流是什么意思是什么Listener { }

3.子RecyclerVappeariew里的item嵌套横向的Recycle开源阅读rView滑动抵触问题

这部分相关于嵌套置顶的处理要简略多了:

override fun dispatchTouchEvent(e: MotionEvent): Boolean {
val x = e.rawX
val y = e.rawY
wheAndroidn (e.action) {
MotionEvent.ACTION_DOWN -> {
downX = x
downandroid下载装置Y = y
}
MotionEvent.ACTION_MOVE -> {
// 获取到间隔差
val dx: Float = x - doAndroidwnX
val dy: Float = y -appearance downY
// 经过间隔差判别方向
val orientation =app装置下载 getOrientation(dx, dy)
val location = intArrayOf(0,android什么意思 0)
getLocationOnScreen(location)
when (orientatio开源软件n) {
// 上下滑动时抛给ChildRecycandroid平板电脑价格lerViandroid的drawable类ew处理
"d" -> pareandroid/yunosnt.requestDisallowInterceptTouchEvent(false)
"u" -> paandroid体系rent.requestDisallowInterceptTouappearancechEvent(false)
"r" -> {
if (canScrollVertically(-1)) {
// 能够向右滑动时,自己处理,能够内部左右滑
parent.reqappreciateuestDisallowInterceptTouchEvent(tandroid平板电脑价格rue)
} else {
// 右滑动到顶时,交给parent处理,使其能够滑到ViewPager下一个的position
parent.requestDisallowInterceptTouchEvent(falapplicationse)
}
}
"l" -> {
if (canScrollVertically(-1)) {
parent.requestDisallowInterceptTouchEvent(true开源节流)
} eandroid什么意思lse {
parent.requestDisallowInteapplicationrceappleptToucAndroidhEvent(false)
}
}
}
}
}
return super开源是什么意思.dispaandroid体系tchTouchEvent(e)
}

4.Android 4.4惯性滑动溃散问题

上到线上后appointment发现,运用Android 4.4手机惯性滑动间断后会必现溃散,详细原因是
onNestedScrollA开源软件ccepted() was adde开源节流d in API 21. You can't use it in lower API levels.,由于运用此版其他人数很少,所以大概处理了一下:

    override fun onNandroid手机estedPreFling(target: View, velocityX: Floatandroid下载, velocityY: Float)开源矿工: Boolean {
try {
if (android.os.Build.VERSION.SDK_INT <= 19) {
return true
}
return super.onNestedPreFling(taandroid什么意思rget, velocityX, velocityY)
} catch (e: Exception) {
return tappearrue
}
}

总结

此项目是在PersistentRecyclerViewandroid的drawable类开展批改而来,其中处理了部分卡顿兼容问题和加了下拉改写上拉加载功用,且经过一段时间的大范围运用,底子趋于安稳,运用起来愈加方便了。项目代码放在了ByR开源节流ecyclerView / stickyrv,由于不是必要的功用所以没放在libapproverary里,假定需求运用自行复制代码即可。有问题能够提issues,再次感谢作者的开源精力。