抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

ViewPager 套 RecyclerView 滑动冲突问题

界面布局大概描述一下,就是常见的四大金刚主页中某个 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 的在用了协程之后现在学不学也就不重要了~

以上!


本站由以下主机服务商提供服务支持:

0条评论

发表评论