【问题标题】:Drag and Drop to reorder and move from one to another recycling view拖放以重新排序并从一个回收视图移动到另一个回收视图
【发布时间】:2022-07-28 15:20:02
【问题描述】:

我正在构建一个应用程序,以便能够将一个项目从一个回收视图拖动到另一个视图,但我仍然必须在单个回收视图中保留重新排序的选项。

所以我已经定义了一个重新排序回调

class ReorderHelperCallback(val adapter : ItemTouchHelperAdapter): ItemTouchHelper.Callback() {

    override fun getMovementFlags(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder
    ): Int {
        val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or
                ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
        return makeMovementFlags( dragFlags, 0)//swipeFlags )
    }

    override fun onMove(
        recyclerView: RecyclerView,
        source: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        adapter.onItemMove(source.getAdapterPosition(),
            target.adapterPosition)
        return true
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        //Not use for Drag N Drop
    }

}

也是一个接口:

interface OnStartDragListener {
    fun onStartDrag(viewHolder: RecyclerView.ViewHolder?)
}

还有一个触控助手:

interface ItemTouchHelperAdapter {
    fun onItemMove(fromPosition: Int, toPosition: Int): Boolean
    fun onItemDismiss(position: Int)
}

为了让重新排序工作,我必须更新 Recycler 视图适配器,如下所示:


class Adapter(
    private var context: Context?,
    val dragStartListener : OnStartDragListener
): RecyclerView.Adapter<Adapter.ViewHolder>(), ItemTouchHelperAdapter {

    var arrayItems : ArrayList<Data?> = ArrayList()

    fun setData(array : MutableList<Data?>){
        array.toCollection(arrayItems)
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int {
        return arrayItems.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
        val binding = DashboardTileLayoutBinding
            .inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding, dragStartListener)
    }

    override fun onBindViewHolder(holder: Adapter.ViewHolder, position: Int) {
        holder.setData(arrayItems[position])
    }

    inner class ViewHolder(val binding: LayoutBinding,
                           val dragStartListener : OnStartDragListener? = null)
        : RecyclerView.ViewHolder(binding.root) {

        val tileLayout = binding.tileLayout

        fun setData(data: Data?) {

           ....
            tileLayout.setOnDragListener { view, dragEvent ->
                when(dragEvent.action) {
                    ACTION_DRAG_STARTED -> {
                        dragStartListener?.onStartDrag(this)
                        true
                    }
                    else -> false
                }
            }
        }
    }

    override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
        Collections.swap(arrayItems, fromPosition, toPosition)
        notifyItemMoved(fromPosition, toPosition)
        return true
    }

    override fun onItemDismiss(position: Int) {
        TODO("Not yet implemented")
    }


}

以及包含 rv 的片段,我已经更新了适配器初始化:

list1adapter?.let { adapter ->
                adapter.setData(list)
                val callback: ItemTouchHelper.Callback = ReorderHelperCallback(adapter)
                mItemTouchHelperSelected = ItemTouchHelper(callback)
                mItemTouchHelperSelected?.attachToRecyclerView(selectedLayout)
            }
---


override fun onStartDrag(viewHolder: RecyclerView.ViewHolder?) {
        viewHolder?.let {
            mItemTouchHelperSelected?.startDrag(it)
        }
    }

但我的片段包含 2 个回收站视图。 list1 可以正常工作,用户拖放以重新排序项目,但现在,我还希望能够将项目从我的 rv list1 移动到 list2,反之亦然

任何想法,如何制作 Kotlin ?我尝试了一个示例代码,但我失去了重新排序。

谢谢

【问题讨论】:

    标签: android kotlin android-recyclerview drag-and-drop


    【解决方案1】:

    你能解决你的问题吗,我面临着完全相同的问题。感谢任何帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 2011-01-31
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多