美文网首页高级UI小技巧
RecyclerView的item中嵌套Scrollview的滑

RecyclerView的item中嵌套Scrollview的滑

作者: 程序员大耳 | 来源:发表于2019-05-18 11:16 被阅读64次

    RecyclerView的item中嵌套Scrollview的滑动冲突解决场景

    外层是一个RecyclerView rv ,每个Item中又有一个可以上下滑动的Scrollview sv

    解决方法

    1、rv addOnItemTouchListener 监听touchEvent获取event坐标点,给ViewHolder判断是否请求不拦截.

    rv addOnItemTouchListener 监听touchEvent获取event坐标点,给ViewHolder判断是否请求不拦截.

    rv.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {

              override fun onTouchEvent(rv: RecyclerView?, e: MotionEvent?) {

              }

              override fun onInterceptTouchEvent(rv: RecyclerView?, e: MotionEvent?): Boolean {

                  if (e != null) {

                      //找到被点击位置的item的rootView

                      val view = rv?.findChildViewUnder(e.x, e.y)

                      if (view != null) {

                          //通过rootView找到对应的ViewHolder

                          val holder = rv.getChildViewHolder(view) as CombineAdapter.ViewHolder

                          //由ViewHolder决定要不要请求不拦截,如果不拦截的话event就回一路传到rootView中.否则被rv消费.

                          rv.requestDisallowInterceptTouchEvent(holder.isTouchNsv(e.rawX, e.rawY))

                      }

                  }

                  return false

              }

              override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {

              }

          })

    2、判断event坐标点是否在sv范围内:

    /**

            *

            * @param x event的rowX

            * @param y event的rowY

            * @return 这个点在不在sv的范围内.

            */

          public boolean isTouchNsv(float x,float y) {

              int[] pos = new int[2];

              //获取sv在屏幕上的位置

              mall_nsv.getLocationOnScreen(pos);

              int width = mall_nsv.getMeasuredWidth();

              int height = mall_nsv.getMeasuredHeight();

              return x >= pos[0] && x <= pos[0] + width && y >= pos[1] && y <= pos[1] + height;

          }

    这样在滑动位置处于sv上的时候,event就被传到了sv中,触发sv的滑动.不在sv上的时候不做处理,触发rv的滑动。

    总结:父布局onInterceptTouchEvent中判断要拦截或者不要拦截的事件区域。

    相关文章

      网友评论

        本文标题:RecyclerView的item中嵌套Scrollview的滑

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