在滑动完成并在ItemTouchHelper.Callback
实例上调用onSwiped
之后,有没有一种方法可以恢复滑动操作并将视图定位符恢复到其初始位置?我让RecyclerView
、ItemTouchHelper
和ItemTouchHelper.Callback
实例完美地协同工作,我只需要还原swipe动作,在某些情况下not remove被滑动的项目。
发布于 2015-08-23 01:59:06
经过一些随机的尝试,我找到了一个解决方案。在您的适配器上调用notifyItemChanged
。这将使刷出的视图动画回到其原始位置。
发布于 2018-01-02 16:34:30
您应该在ItemTouchHelper.Callback
中重写onSwiped
方法并刷新该特定项。
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder,
int direction) {
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
}
发布于 2015-08-07 15:51:12
谷歌的ItemTouchHelper
实现假设每个刷出的项目最终都会从回收器视图中删除,而在某些应用程序中可能并非如此。
RecoverAnimation
是ItemTouchHelper
中的一个嵌套类,用于管理滑动/拖动项目的触摸动画。虽然名称暗示它只恢复项目的位置,但它实际上是唯一一个用于恢复(取消滑动/拖动)和 replace (滑动时移出或拖动时替换)项目的类。奇怪的名字。
在RecoverAnimation
中有一个名为mIsPendingCleanup
的布尔型属性,ItemTouchHelper
使用它来判断项目是否等待删除。因此,在将RecoverAnimation
附加到项目之后,ItemTouchHelper
会在成功移出后设置此属性,并且只要设置了此属性,动画就不会从恢复动画列表中删除。问题是,将始终为刷出的项目设置mIsPendingCleanup
,导致该项目的RecoverAnimation
永远不会从动画列表中删除。因此,即使你在成功滑动后恢复了项目的位置,只要你触摸它,它就会被送回被刷出的位置-因为RecoverAnimation将导致动画从最新的被刷出的位置开始。
不幸的是,解决方案是将ItemTouchHelper
类源代码复制到与support库中相同的包中,并从RecoverAnimation
类中删除mIsPendingCleanup
属性。我不确定这是否被谷歌接受,我还没有在Play Store上发布更新,看看它是否会导致拒绝,但你可以在https://gist.github.com/kukabi/f46e1c0503d2806acbe2找到支持库v22.2.1的类源代码,上面提到的修复。
https://stackoverflow.com/questions/31787272
复制相似问题