两个recyclerviews的Android ItemTouchHelper
Posted
技术标签:
【中文标题】两个recyclerviews的Android ItemTouchHelper【英文标题】:Android ItemTouchHelper for two recyclerviews 【发布时间】:2021-10-29 04:20:42 【问题描述】:我正在创建一个启动器应用程序,我正在使用 RecyclerView 和 ItemTouchHelper 对图标进行重新排序,效果很好。
但我想将我的项目拖放到另一个回收站视图(文件夹、底部图标、其他页面)
ItemTouchHelper 可以吗?我该怎么做?
这是我的代码:
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback()
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int
return makeMovementFlags(
ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT,
0
)
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean
adapter.moveItems(viewHolder.adapterPosition, target.adapterPosition)
return true
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int)
override fun isLongPressDragEnabled(): Boolean
return true
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int)
super.onSelectedChanged(viewHolder, actionState)
viewHolder?.itemView?.animate()?.setDuration(200)?.scaleX(1.09f)?.scaleY(1.09f)?.start()
override fun clearView(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
)
super.clearView(recyclerView, viewHolder)
viewHolder?.itemView?.animate()?.setDuration(200)?.scaleX(1f)?.scaleY(1f)?.start()
)
itemTouchHelper.attachToRecyclerView(binding.recycler)
结果:
【问题讨论】:
【参考方案1】:我不会尝试在两个Adapters
之间传输ViewHolder
,而是使用一个具有不同视图类型的Adapter
,例如示例中的底行看起来不同并且有一些特殊的逻辑,但我可以看到它们属于同一个Adapter
。
当ItemTouchHelper
“拾取”ViewHolder
时,您可以确定当它落在特定类型的ViewHolder
上时会做什么。
如果将它放在FolderViewHolder
的顶部而不是移动另一个ViewHolder
s,它会将持有的ViewHolder
“放置”在FolderViewHolder
内部,而不是实际的ViewHolder
,而是它的基础数据型号。
FolderViewHolder
可以包含放入其中的所有数据模型的List
。此时,当用户单击FolderViewHolder
时,您可以使用相同的RecyclerView
/Adapter
/ViewHolder
组合来显示另一个包含数据的网格视图。
【讨论】:
以及如何在页面之间移动项目?两个 viewpager 页面不能使用相同的 recyclerview 您需要检测用户是否将项目拉离屏幕,RecyclerView
应该能够告诉您该信息。当它拉出项目的数据需要传递到新页面并添加到它的RecyclerView
's Adapter
。 android 操作系统如何完成它很可能类似于对实际逻辑解决方案的欺骗。动画、过渡和视图交换。我的意思是,如果你看看 RecyclerView
s 的工作方式,他们就充满了诡计。
这不是个好主意,我正在寻找更好的方法以上是关于两个recyclerviews的Android ItemTouchHelper的主要内容,如果未能解决你的问题,请参考以下文章
翻译Android RecyclerView CardView
Android高级UI:RecyclerView优雅地解决瀑布流的两个神坑