Android DIY之路 (四)拖拽替换,一个view发送其他所有view绑定即可监听到。

前言

最近一个工作需求就是做两个列表之间item的拖拽替换。listview带适配器的均可。
最核心部分一个view开始拖拽 其他需要的地方 接收这一DragEvent

20161020更新 现在看以前的方法真是太SB了。所以今天来更新。
就一个逻辑。
一个view 被拖拽 处处都可以接收。哪怕是不同frament;

任意view都可以实现 跟你本身项目不会有任何冲突。

效果图

这里写图片描述

1. 长按开启拖拽

//这里长按事件加在 第一个拖拽item的列表的item长按事件中 recyclerview1
       v.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        shadowView = v;
                        String TAG = "test";
                        ClipData.Item item = new ClipData.Item((String) v.getTag());
                        ClipData data = new ClipData(TAG, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
                        Object obj =xxxx;//你想传递的数据。比如你想拖拽替换图片
                        v.startDrag(data, new View.DragShadowBuilder(v), obj, 0);
                        //第一个view就是 长按谁点击 第二个就是影子的样子 
                        return true;
                    }
                });

2. 监听拖拽区域即另一个列表的每一个item

不仅是item 甚至可以精确到你落点在哪一个view上面。只要你想接收到这一拖拽事件 都可以如下绑定
影子变化也可以随心自定义

public class DragUtils {

        //用这一接口方便 两个view之间所在的调用
    public interface DragStatus {
        void complete(String obj);
    }

    public static void bindDragInZone(View view, final DragStatus impl) {
        final int[] dragPoint = new int[2];
        final boolean[] isIn = {false};
        final String[] localState = {""};
        view.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                final int action = event.getAction();

                switch (action) {
                    case DragEvent.ACTION_DRAG_STARTED://拖拽开始
                        localState[0] = (String) event.getLocalState();
                        Log.i("rex", "localState-----" + localState[0]);
                        if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
//                            shadowView.setBackgroundResource(R.drawable.xml_rect_line_bg);
                            return true;
                        }

                        return false;
                    case DragEvent.ACTION_DRAG_ENTERED://拖拽进入目标区域

                        Log.i("rex", "拖拽进入目标区域" + event.getX() + "----" + event.getY());
                        ULog.e("拖拽进入目标区域");
                        isIn[0] = true;

                        return true;
                    case DragEvent.ACTION_DRAG_LOCATION://拖拽位置
                        return true;

                    case DragEvent.ACTION_DRAG_EXITED://拖拽到目标区域外
                        isIn[0] = false;

                        ULog.e("拖拽到目标区域外");
                        return true;
                    case DragEvent.ACTION_DROP: //拖拽完成之后松开手指

                        ULog.e("拖拽完成之后松开手指" + event.getX() + "----" + event.getY());
                        dragPoint[0] = (int) event.getX();
                        dragPoint[1] = (int) event.getY();

                        return true;
                    case DragEvent.ACTION_DRAG_ENDED://拖拽完成
                        if (isIn[0] && !TextUtils.isEmpty(localState[0]) && impl != null) {
                            impl.complete(localState[0]);
                        }
                        isIn[0] = false;
//                        shadowView.setBackgroundResource(0);
//                        if (!isIn) {
//                            return true;
//                        }

//                        findDragPostion(dragPoint[0], dragPoint[1]);
//                        isIn = false;

                        return true;
                    default:
                        break;
                }
                return false;
            }
        });
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Android开发中,如何实现两个列表数据互相拖拽增加呢?这涉及到RecyclerView的使用。RecyclerViewAndroid Support Library提供的一种高效的可重复使用的视图组件,它集成了ListView的优点,但是同时也提高了它的效率和灵活性。 要实现两个列表数据互相拖拽增加,首先需要在布局文件中定义两个RecyclerView,并分别设置它们的LayoutManager和Adapter。然后,在Adapter中需要重写ItemTouchHelper.Callback类中的onMove()方法,以便实现拖拽交换数据位置的效果。具体步骤如下: 1.创建两个RecyclerView和两个Adapter,并为它们分别设置LayoutManager。 2.在Adapter的构造方法中,初始化全局变量mDragFrom(用于存储当前被拖拽的数据位置)和mDragTo(用于存储要拖拽目标的数据位置)。 3.重写Adapter中的onBindViewHolder()方法,为每个ViewHolder设置拖拽操作监听器。 4.重写ItemTouchHelper.Callback类中的onMove()方法,实现数据位置的交换操作,同时更新mDragFrom和mDragTo的值。 5.在布局文件中为RecyclerView中的Item设置拖拽效果,例如实现Item的平移和透明度变化效果。 通过以上步骤,即可实现两个RecyclerView数据互相拖拽增加的效果。在实际开发中,还可以通过监听RecyclerView的滑动事件,实现拖拽操作时RecyclerView的滑动自动调整和控制。 ### 回答2: 在Android中,实现两个列表数据互相拖拽增加可以通过使用RecyclerView和ItemTouchHelper来实现。RecyclerView一个灵活的视图组件,可用于在列表和网格中显示大量数据,同时ItemTouchHelper则可以实现拖拽和滑动的操作。 首先需要实现两个RecyclerView列表的布局以及适配器,然后创建一个实现ItemTouchHelper.Callback的类,来处理拖拽和滑动的各种事件。在该类中,使用onMove方法来帮助将item从一个RecyclerView列表拖动到另一个RecyclerView列表,同时在onMove方法中需要通过notifyItemMoved方法来更新数据集和刷新RecyclerView的视图。 具体实现步骤如下: 1. 在布局中添加两个RecyclerView视图,分别设置它们的布局管理器和适配器。 2. 创建一个继承自ItemTouchHelper.Callback的抽象类,并实现需要的方法: - getMovementFlags:设置拖拽和滑动的方向,这里使用ItemTouchHelper.UP | ItemTouchHelper.DOWN 功能来设置水平和竖直方向均可拖拽。 - onMove:在拖拽过程中,通过RecyclerView的适配器将拖拽产生的位置和目标位置对应的数据进行交换。 - onSwiped:拖拽结束后,根据状态进行后续的操作。 3. 在MainActivity类中,分别创建两个实例RecyclerView,分别为dragRecyclerView和dropRecyclerView,并分别设置适配器和布局管理器。 4. 创建一个ItemTouchHelper实例,并将其绑定到两个RecyclerView视图上。 5. 在Adapter类中,更新数据集并调用notifyDataSetChanged或notifyItemMoved方法进行数据刷新。 通过以上步骤的实现,就可以实现两个RecyclerView视图的拖拽操作,从而增加、删除或调整列表中的数据项。 ### 回答3: Android 的 Recycler View一个强大的列表控件,可以用于展示复杂的数据列表。在某些情况下,我们可能需要将 Recycler View 中的两个列表数据进行互相拖拽增加的操作,比如拖动 A 列表中的项到 B 列表中,或者将 B 列表中的项拖到 A 列表中。 为了实现这个功能,我们需要在 RecyclerView.Adapter 中重写一些方法,比如 onItemMove 和 onItemDismiss。我们还需要实现 ItemTouchHelper.Callback 接口,这个接口提供了很多可以重写的方法来控制拖拽和滑动的行为。 在重写 onItemMove 方法时,我们需要通过源列表的 position 和目标列表的 position 来确定拖动的项的位置。然后调用 notifyItemMoved 方法来更新列表的位置并刷新界面。 在重写 onItemDismiss 方法时,我们需要判断是左侧列表还是右侧列表,然后将对应的项进行删除操作。 总体来说,实现 android recycle 两个列表数据互相拖拽增加的操作涉及到了很多细节,需要仔细考虑。我们可以参考已有的第三方库,比如 ItemTouchHelper 和 recyclerview-drag-and-drop-utils 等,来加速开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值