美文网首页
解决viewPager和recycleView的滑动冲突

解决viewPager和recycleView的滑动冲突

作者: 因为我的心 | 来源:发表于2023-02-15 10:14 被阅读0次

一、前言:

viewPager里包含横向的recycleView时,横向滑动recycleView会导致viewPager翻页,


图片.png

注意:GridLayoutManager 竖向4个,然后整体横向滑动

    //---下方图书列表---
                rvList.apply {
                    val gridLayoutManager = GridLayoutManager(context,4)
                    gridLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
                    if (rvList.itemDecorationCount<=0){
                        addItemDecoration(SpacesItemDecoration(15))
                    }

                    setPadding(15.dp,0,0,0)
                    layoutManager = gridLayoutManager
                    adapter = madapter
                    currentStyleList?.let {
                        madapter.setList(currentStyleList)
                    }
                }

1、解决办法是:

/**
 * zivon
 * 解决viewPager和recycleView的滑动冲突
 */
class NestedRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
 
    private val globalRect: Rect = Rect() // 临时数据
 
    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        var x = ev?.rawX?.toInt()
        var y = ev?.rawY?.toInt()
        getGlobalVisibleRect(globalRect)
        if (ev?.action == MotionEvent.ACTION_MOVE) {
            if (globalRect.contains(x!!, y!!)) {
                parent.requestDisallowInterceptTouchEvent(true)
            }
        }
        return super.dispatchTouchEvent(ev)
    }
}

这里还有一个问题就是,如果横向recycleView是被嵌套在纵向scrollView里的话,在recycleView区域上下滑动的时候,不会触发整个界面的纵向滑动。需要在上面代码中加滑动方向的判断,只需要在横向滑动的时候调用parent.requestDisallowInterceptTouchEvent(true)

2、解决办法

后来发现横向滑动没问题,竖向滑动不灵敏,就注释掉几行代码,就OK了。

class NestedRecyclerView(context: Context, attrs: AttributeSet?) : RecyclerView(context, attrs) {
 
    private val globalRect: Rect = Rect() // 临时数据
 
    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        var x = ev?.rawX?.toInt()
        var y = ev?.rawY?.toInt()
        getGlobalVisibleRect(globalRect)
//        if (ev?.action == MotionEvent.ACTION_MOVE) {
//            MyToash.Log("home","----x:${x}   y:${y}")
//            MyToash.Log("home","----globalRect :${globalRect.contains(x!!, y!!)}")
//            if (globalRect.contains(x!!, y!!)) {
//                parent.requestDisallowInterceptTouchEvent(true)
//            }
//
//        }
        return super.dispatchTouchEvent(ev)
    }
}

参考:https://codeleading.com/article/69322010185/

相关文章

网友评论

      本文标题:解决viewPager和recycleView的滑动冲突

      本文链接:https://www.haomeiwen.com/subject/dywykdtx.html