在开发中遇到当RecyclerView的item中存在一个recyclerview或button时,item的点击事件在子recyclerview或button区域会被拦截。被button控件拦截时,可以给button设置与item相同的点击事件即可解决问题。但是给子recyclerview设置点击事件是无效的,因此只能寻找其他解决方式。 解决方式: 重写子recyclerview的触摸事件,将触摸事件模拟为父控件的点击事件 ~~~kotlin holder.rv.setOnTouchListener { _, event -> if (event.getAction() == MotionEvent.ACTION_UP) { holder.itemView.performClick() //模拟父控件的点击事件 } false } ~~~ 参考文章:[父控件的点击事件被Recyclerview拦截](https://www.jianshu.com/p/b27fbb0a664c) #### View点击事件分发机制 ##### 简介: 点击事件主要由三个方法来完成:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,三个方法的参数都只有MotionEvent一个。 在事件能够传递到当前View的情况下,三个方法的相关情况: dispatchTouchEvent :一定会被调用,用来进行点击事件的分发 onInterceptTouchEvent :表示是否拦截某个事件,不一定会被调用,如果当前View拦截了某个事件,那么在同一事件序列中此方法不会被再次调用 onTouchEvent :表示是否消耗当前事件,如果不消耗当前事件的话,则同一事件序列中当前View无法再次接收到事件。 ##### 结论: 1.如果一个View的onTouchEvent返回false,那么它的父容器onTouchEvent会被调用,根据ViewGroup进行事件传递; 2.同一个事件序列值得是从手指接触屏幕到手指离开屏幕的过程; 3.某个View一旦拦截事件,则一整个事件都要由他处理,且它的onInterceptTouchEvent不会再被调用; 4.某个View如果一开始onTouchEvent返回了false,则同一事件序列的其他事件都不会再交给它处理 参考文章:[Android点击事件分发/拦截](https://blog.csdn.net/qq_38237213/article/details/83279152?spm=1001.2101.3001.6650.1&depth_1-) 最后修改:2022 年 05 月 27 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏