Android Fragments 是否可以将一个项目拖到UnclerView之外?

vecaoik1  于 9个月前  发布在  Android
关注(0)|答案(2)|浏览(56)

我需要以某种方式通知RecyclerView当我拖放一个项目从另一个RecyclerView到它。

带有蓝色项的RecyclerView在一个片段中,带有红色项的RecyclerView在另一个片段中。
我也试过使用ItemTouchHelper,但它的onMove()方法从ItemTouchHelper.Callback没有被调用,而与项目从RecyclerView外部移动。

private class CustomItemTouchCallback extends Callback {

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        return makeMovementFlags(UP|DOWN|START|END, 0);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        android.util.Log.d(TAG, "Move item  from:" + viewHolder.getAdapterPosition() + " to: " + target.getAdapterPosition());
        return true;
    }

    @Override
    public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
        android.util.Log.d(TAG, "Moved item  from:" + fromPos + " to: " + toPos + " x: " + x + " y: " + y);
        super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return false;
    }
}

我也找到了这个question,但它不能解决我的问题。

btqmn9zl

btqmn9zl1#

老问题,但还没有答案,所以我提供一个简短的...
要将某些内容从一个视图拖动到另一个视图,可以使用DragShadowBuilderItemTouchHelper仅用于在RecyclerView中移动项目,您需要自定义实现。
查看此文档:https://developer.android.com/guide/topics/ui/drag-drop(所以是的,你想要的应该是这个经典的拖放框架,正如你所说的那样)
它向您展示了如何创建阴影,如何移动它(自动完成)以及如何在第二个视图中对拖动事件做出React。
工作流程如下:
1.创建拖动阴影时,例如。长按RecyclerView 1中的项目(它是项目的副本,在应用程序上绘制)
1.阴影可以移动,框架已经处理了;这将调用拖动进入/退出和拖动事件在视图上,它被拖动
1.在第二个RecyclerView上添加View.OnDragListener并处理事件(例如,如果用户将数据放在第二个RecyclerView上,则将其添加到第二个RecyclerView中,并将其从第一个RecyclerView中删除)
DragShadowBuilder的帮助下,您可以找到相关教程,例如。这里的一个:http://www.vogella.com/tutorials/AndroidDragAndDrop/article.html

r8xiu3jd

r8xiu3jd2#

我已经使用ItemTouchHelper和OnItemTouchHelper完成了这一操作

var selectedViewHolder: RecyclerView.ViewHolder? = null

    val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
        ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.ACTION_STATE_DRAG, 0
    ) {
        override fun onMove(
            recyclerView: RecyclerView,
            source: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            val sourcePosition = source.adapterPosition
            val targetPosition = target.adapterPosition
            if (selectedViewHolder == null) {
                selectedViewHolder =
                    recyclerView.findViewHolderForAdapterPosition(sourcePosition)
                Collections.swap(customerList, sourcePosition, targetPosition)
                custAdapter.notifyItemMoved(sourcePosition, targetPosition)
                return true
            }
            return false

        }
        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        }
    })
    itemTouchHelper.attachToRecyclerView(binding.rvCustomerList)

    binding.rvCustomerList.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
        val gestureDetector = GestureDetector(
            requireContext(),
            object : GestureDetector.SimpleOnGestureListener() {
                override fun onLongPress(e: MotionEvent) {
                    val childView = binding.rvCustomerList.findChildViewUnder(e!!.x,e!!.y)
                    motionEvent = MotionEvent.obtain(e)
                    when (e?.action) {
                        MotionEvent.ACTION_DOWN -> {
                            val data = ClipData.newPlainText("", "")
                            val shadowBuilder = DragShadowBuilder(
                                childView
                            )
                            childView!!.startDrag(data, shadowBuilder, view, 0)
                            motionEvent = MotionEvent.obtain(e)
                          
                        }
                        MotionEvent.ACTION_MOVE -> {
                            childView!!.x = e.x
                            childView!!.y = e.y
                        }
                        else -> {
                        }
                    }
                }
            })

        override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
            gestureDetector.onTouchEvent(e)
            return false
        }

        override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}

        override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
    })

在此rvCustomerList中,是用户视图。现在,我可以将所选项目从recyclrview移动到屏幕的任何位置。
希望这对你有帮助。

相关问题