itemtouchhelper实现recyclerview的侧滑菜单及处理item的子view点击事件

最近项目上要做聊天会话列表,需要侧滑菜单来实现删除,静音等操作,由于这一块儿没有太多经验,于是首先想到了Android API提供的itemtouchhelper。这个类,是用来实现item的拖动,滑动等效果的。怎么用呢,点开源码看一下,

最后一句关键,意思是大多数情况下,你只需要重写onChildDraw方法,并在里面实现你自己的行为即可。

然而,这个类默认效果是需要滑动整个item的宽度的,做侧滑菜单当然不需要滑动这么宽,何如?

此时,就要在继承自itemtouchhelper.callback的子类中的onchilddraw方法中自己定义滑动宽度并实现滑动效果了。


可以看到,该方法提供了viewholder,滑动距离dx等,通过viewholder可以拿到item中的任意子view,那么就可以自定义行为了。

然而,当你给item中的子view设置点击事件时,你会发现,手机点烂了也不会响应你的点击事件。这是因为点击事件的下发被阻止了,view接收不到事件。那只能另辟蹊径了。触摸事件会不会被阻止呢?试一下给recyclerview设置ItemTouchListener,在onInterceptTouchEvent方法中log一下,发现可以响应。那么另一个方法就来了,我们可以根据motionevent的点击位置,即x,y坐标来判断当前点击处于哪一个子view的范围,从而来响应它的点击。


可以看到,此方法提供了recyclerview,那就可以根据recyclerview拿到adapter,viewholder等,然后就可以做子view的点击响应了。

到此,功能基本算是实现了。这种方式有一个小问题,需要右滑隐藏菜单时,滑动距离要很大,基本等于item的宽度才行,总的来说体验不是很完美,有待改进。有想法的朋友欢迎留言一起交流。

你可能感兴趣的:(itemtouchhelper实现recyclerview的侧滑菜单及处理item的子view点击事件)