Android - 在 ConcatAdapter 上拖放

问题描述 投票:0回答:1

我正在尝试在

ConcatAdapter
中实现拖放。我做了一个
ConcatAdapter
bc 我有多个部分,其中的项目不同,所以我只需要拖放到一个部分内即可。

我做了一个带有 2 个适配器的 ConcatAdapter 我为回收器视图做了 ItemTouchHelper ->

itemTouchHelper.attachToRecyclerView(binding.recyclerView)

我猜这与

ItemTouchHelper
有关,因为它设置在
RecyclerView
上而不是适配器上。

有什么方法可以在

ConcatAdapter
内设置 1 个适配器的拖放操作吗?

android android-recyclerview android-concatadapter
1个回答
1
投票

在 ItemTouchHelper.Callback 的 onMove 内部,您可以决定忽略某些移动。使用viewHolder(被拖动的ViewHolder)和targetViewHolder并检查它们的绑定适配器。或者,如果它们是同一适配器的实例,您可以使用在适配器初始化时设置的字段来确定它们是哪个适配器。

在下面的示例中,我有两个适配器,均为 TaskAdapter 类型,但第二个适配器保存已完成的任务。未完成的任务无法在已完成的任务之间移动,已完成的任务根本无法移动。因此,如果 targetViewHolder 被标记为已完成的适配器绑定,我只需返回 false 并忽略该移动。显然,一个项目已被拖动到该目标项目上,但由于它实际上并未移动,因此用户知道这是不允许的并将放弃。我认为这是可以接受的,并且比拥有多个 RecyclerView 更好。

override fun onMove(
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder,
    targetViewHolder: RecyclerView.ViewHolder
): Boolean {
    val targetAdapter = targetViewHolder.bindingAdapter as TaskAdapter
    if (targetAdapter.completed) return false
    val adapter = viewHolder.bindingAdapter as TaskAdapter
    adapter.moveItem(
        viewHolder.bindingAdapterPosition,
        targetViewHolder.bindingAdapterPosition
    )
    return true
}

如果你想让某些项目一开始就不能被拖动,你可以从 getDragDirs 返回 0 。在此示例中,它们是已完成的任务。

override fun getDragDirs(
    recyclerView: RecyclerView,
    viewHolder: RecyclerView.ViewHolder
): Int {
    val adapter = viewHolder.bindingAdapter as TaskAdapter
    if (adapter.completed) return 0
    return super.getDragDirs(recyclerView, viewHolder)
}
© www.soinside.com 2019 - 2024. All rights reserved.