我搞了个RecyclerView,里面有很多item,我对想其进行拖动排序。现在已经能实现拖动排序了,用ItemTouchHelper实现的。现在的问题是:排完序之后,如何取消拖动排序?我尝试过关闭长按,控件.setLongClickable(false)——但它跟本不吃这一套。长按监听一直不能取消。有人说,在设置.setLongClickable(false)之前,要在前面加.setOnLongClickListener。我试了,依然不起用。我于是又想在ItemTouchHelper.Callback里动手脚,让他返回null。但万恶的代码编译软件,直接让软件闪退!没办法,写了一句:recreate();或者是:Intent intent = new Intent(this, MainActivity.class); startActivity(intent);——让一切回到起点。一是不知道这两个方法哪个好,二是觉得这屏幕总是闪,也不是个办法,还有没有其它更好的办法呢?
参考GPT和自己的思路:
对于您的问题,我可以给出几个解决方案:
在排完序后,调用ItemTouchHelper的onItemDragStateChanged方法,将dragging状态改为false,这样就可以取消拖动排序了。
在ItemTouchHelper.Callback的onSelectedChanged方法中,当state为ItemTouchHelper.ACTION_STATE_IDLE时,将长按监听取消,代码如下:
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
super.onSelectedChanged(viewHolder, actionState)
if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder?.itemView?.setOnLongClickListener(null)
}
}
private var isSorting = false
override fun onTouch(view: View, event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
if (!isSorting) {
// 进行排序相关操作
}
}
return true
}
fun cancelDragging() {
isSorting = false
}
以上几个解决方案可以根据您的实际情况来选择适合的方法。
不知道你这个问题是否已经解决, 如果还没有解决的话:当然也可以给图标单独加上动画,比如将Icon上滑。
private fun customizeSplashScreenExit() {
splashScreen.setOnExitAnimationListener { splashScreenView ->
showSplashIconExitAnimator(splashScreenView)
}
}
private fun showSplashIconExitAnimator(splashScreenView: SplashScreenView) {
val iconView = splashScreenView.iconView ?: return
val slideUp = ObjectAnimator.ofFloat(
splashScreenView.iconView,
View.TRANSLATION_Y,
0f,
-iconView.height * 2.toFloat()
)
...
slideUp.start()
}