两个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 的顶部而不是移动另一个ViewHolders,它会将持有的ViewHolder“放置”在FolderViewHolder 内部,而不是实际的ViewHolder,而是它的基础数据型号。

FolderViewHolder 可以包含放入其中的所有数据模型的List。此时,当用户单击FolderViewHolder 时,您可以使用相同的RecyclerView/Adapter/ViewHolder 组合来显示另一个包含数据的网格视图。

【讨论】:

以及如何在页面之间移动项目?两个 viewpager 页面不能使用相同的 recyclerview 您需要检测用户是否将项目拉离屏幕,RecyclerView 应该能够告诉您该信息。当它拉出项目的数据需要传递到新页面并添加到它的RecyclerView's Adapterandroid 操作系统如何完成它很可能类似于对实际逻辑解决方案的欺骗。动画、过渡和视图交换。我的意思是,如果你看看 RecyclerViews 的工作方式,他们就充满了诡计。 这不是个好主意,我正在寻找更好的方法

以上是关于两个recyclerviews的Android ItemTouchHelper的主要内容,如果未能解决你的问题,请参考以下文章

Android学习之Recyclerview

翻译Android RecyclerView CardView

Android高级UI:RecyclerView优雅地解决瀑布流的两个神坑

android recyclerview 的使用限制

Android:RecyclerView里面的RecyclerView,滚动到底部

android RecyclerView adapter 封装