【问题标题】:Android ItemTouchHelper for two recyclerviews两个recyclerviews的Android ItemTouchHelper
【发布时间】: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)

结果:

【问题讨论】:

    标签: android kotlin android-recyclerview android-viewpager itemtouchhelper


    【解决方案1】:

    我不会尝试在两个Adapters 之间传输ViewHolder,而是使用一个具有不同视图类型的Adapter,例如示例中的底行看起来不同并且有一些特殊的逻辑,但我可以看到它们属于同一个Adapter

    ItemTouchHelper“拾取”ViewHolder 时,您可以确定当它落在特定类型的ViewHolder 上时会做什么。

    如果将它放在FolderViewHolder 的顶部而不是移动另一个ViewHolders,它会将持有的ViewHolder“放置”在FolderViewHolder 内部,而不是实际的ViewHolder,而是它的基础数据型号。

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

    【讨论】:

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