6

ViewPager 套 RecyclerView 滑动冲突问题

 2 years ago
source link: http://i.lckiss.com/?p=7982
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ViewPager 套 RecyclerView 滑动冲突问题

2022-04-13

界面布局大概描述一下,就是常见的四大金刚主页中某个 fragment 需要一个横向滚动的工具栏,那么很容易出现焦点抢占问题,这倒不是什么新问题,网上大把答案,不过一直没记录,记录一下:

class NestedRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
    RecyclerView(context, attrs) {

    var intercept: (() -> Boolean)? = null

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        val canScrollHorizontally = canScrollHorizontally(-1) || canScrollHorizontally(1)
        val canScrollVertically = canScrollVertically(-1) || canScrollVertically(1)
        if (canScrollHorizontally || canScrollVertically || intercept?.invoke() == true) {
            this.parent?.requestDisallowInterceptTouchEvent(true)
        } else {
            this.parent?.requestDisallowInterceptTouchEvent(false)
        }
        return super.dispatchTouchEvent(ev)
    }

}

随便取的一个名字,自行实现 intercept 闭包做自己的业务判断。

这里有一个误区值得说一下:之前我以为 requestDisallowInterceptTouchEvent 仅对上一层 parent 有效,但看源码会发现,实际上会按 View 的事件分发一样,不断的回调上层 View 的 requestDisallowInterceptTouchEvent。所以不论是 ViewPager 中套了 Fragment ,再 Fragment 中套 RecyclerView 或者中间再多套几层,实际上都是一样的。

顺便提一嘴:就如今而言,Jetpack Compose 挺香的,或许未来有一天这些都会成为过去式,事件分发机制这些记了忘,忘了记的东西有没有意义呢?

我想说,现在还没到那个时候,面试依旧需要,但真到那时候,自然也就不需要了。没落的东西安心的随时代落幕吧,就像以前没学过 RxJava 的在用了协程之后现在学不学也就不重要了~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK