我的任务是在RecyclerView中实现水平滑动的项目。我实际上已经完成了这个任务,感谢ViewPager源代码和其他一些资源,但是有一个场景出现问题。
我的SwipeableRecyclerView(SRV)扩展了RecyclerView并实现了RecyclerView.OnItemTouchListener以执行魔术,它实际上起作用了。它还定义了一个自定义接口SwipeListener,其中定义了一些方法,最重要的是(对于这个问题)'onSwipe(View view, int position, boolean right)'。
我的活动向SRV提供了接口的实现,当检测到滑动并触发监听器方法时,它会执行以下操作:
因此,两个完成动画都是一个接一个地启动的,当其中一个删除其项目并调用notifyItemRemoved时,另一个完成并调用删除该项。实际上,我不确定这可能是什么,因为所有这些都发生在主线程上,但我猜滚动也是在动画帧中完成的,并且由于第二次删除而需要新的计算。
我的SwipeableRecyclerView(SRV)扩展了RecyclerView并实现了RecyclerView.OnItemTouchListener以执行魔术,它实际上起作用了。它还定义了一个自定义接口SwipeListener,其中定义了一些方法,最重要的是(对于这个问题)'onSwipe(View view, int position, boolean right)'。
我的活动向SRV提供了接口的实现,当检测到滑动并触发监听器方法时,它会执行以下操作:
- 使用'view.animate().translationX(translationX)'将项目/滑动视图正确方向移出屏幕
- 上面启动的动画具有侦听器,在onAnimationEnd中删除指定位置处的项目,并调用adapter.notifyItemRemoved(position)
- 结果是视图消失到滑动的一侧,然后recycler使用其动画删除行-所有这些都非常好地工作
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
而堆栈跟踪显示,adapter.notifyItemRemoved()是导致异常的方法。
对于异常问题,事件顺序如下(来自我的调试跟踪):
started for position: 11
started for position: 10
finished for position: 11
removing 11
removed 11
finished position: 10
removing 10
因此,两个完成动画都是一个接一个地启动的,当其中一个删除其项目并调用notifyItemRemoved时,另一个完成并调用删除该项。实际上,我不确定这可能是什么,因为所有这些都发生在主线程上,但我猜滚动也是在动画帧中完成的,并且由于第二次删除而需要新的计算。
所以,我陷入了困境,不知道该怎么做。实际上,我认为最简单的事情应该是在启动动画时禁用整个回收站视图的触摸,并在滚动完成后再次启用它们。然而,我无法禁用SRV-我尝试过setEnabled(false),clickable等,但没有任何作用。
有什么帮助吗?