拖拽可排序Recyclerview(GridLayoutManager) 实现

github地址:https://github.com/zhangjianqingGitHub/WorkUtils

需求详情:
每个页面显示4个item
item长按拖动可排序
item四边等间距

最后效果

在这里插入图片描述

第一步: 每页显示4个item

1.设置每个item的高度为Recyclerview高度的一半
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        mContext = parent.getContext();
        View view = LayoutInflater.from(mContext)
                .inflate(R.layout.layout_main_recyclerview_item, parent, false);

        MyViewHolder holder = new MyViewHolder(view);
        int parentHeight = parent.getHeight();
        GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
        layoutParams.height = (parentHeight / 2);

        return holder;
    }

第二步:每个item四边等距

1.给RecyclerView添加ItemDecoration
mMainRecyclerView.addItemDecoration(new MyItemDecoration(Utils.dpToPx(this, 20)));
public class MyItemDecoration extends RecyclerView.ItemDecoration {
    private final int space;
    public MyItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

//        RecyclerView.getChildLayoutPosition();
//        RecyclerView.getChildAdapterPosition();
//注意这里 layoutposition和adapterposition的区别
// layoutposition 是页面可见的item的真实位置
// adapterposition 是数据源中item的位置,这里选择adapterposition是因为带回换位后边距不会错乱
        int adapterPosition = parent.getChildAdapterPosition(view);
        // 第一排不添加上边距
        if (adapterPosition != 0 && adapterPosition != 1) {
            outRect.top = space;
        }
		// 0,2,4等挨着左边的item
        if (adapterPosition % 2 == 0) {
            outRect.right = space / 2;
            outRect.left = space;
        } else {
            outRect.left = space / 2;
            outRect.right = space;
        }
    }
}

第三步:可拖动排序(ItemTouchHelper)

1.ItemTouchHelper关联RecyclerView
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelperCallBack());
itemTouchHelper.attachToRecyclerView(mMainRecyclerView);
public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback {


    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//        if (recyclerView.getLayoutManager() instanceof GridLayoutManager){}

        // 长按拖动,不可删除,可换位使用
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

        // 轻扫轻按可滑动删除
//      int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        return makeMovementFlags(dragFlags, 0);
    }

    // 拖拽 排序item时调用
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        int form = viewHolder.getAdapterPosition();
        int to = target.getAdapterPosition();

        boolean isMove = false;

        MainAdapter adapter = (MainAdapter) recyclerView.getAdapter();
        if (adapter != null && adapter.getData() != null) {
            Collections.swap(adapter.getData(), form, to);
//            adapter.notifyDataSetChanged();//这个方法也可解决拖动后item边距错位问题,但是会丢失拖动动画效果
            adapter.notifyItemMoved(form, to);
            isMove = true;
        }
        return isMove;
    }

    // 轻拖滑动出recyclerview后调用(可做删除item)
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        // null
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现两个RecyclerView之间的item互相拖拽可以通过以下步骤进行: 1. 首先,在布局文件中分别添加两个RecyclerView控件。给它们分别设置不同的ID,方便后续代码操作。 2. 在代码中分别找到两个RecyclerView实例,并为它们设置LayoutManager和Adapter。确保两个RecyclerView显示的数据不同。 3. 为每个RecyclerView的Item添加拖拽功能,可以使用ItemTouchHelper类来实现。创建一个ItemTouchHelper实例,并将其附加到两个RecyclerView上。 4. 实现ItemTouchHelper.Callback类,重写以下几个方法: - getMovementFlags:指定拖拽和滑动的方向,可以使用ItemTouchHelper.UP、ItemTouchHelper.DOWN、ItemTouchHelper.LEFT、ItemTouchHelper.RIGHT等常量。 - onMove:处理拖拽事件,通过交换两个Item的位置实现互相拖拽。 - onSwiped:处理滑动事件,可以在这个方法中实现删除Item的操作。 5. 在RecyclerView的Adapter中对Item的触摸事件进行监听,当用户按下item时,调用startDrag方法来开始拖拽。 6. 当拖拽结束时,将交换过位置的数据更新到对应的数据源中,并刷新RecyclerView。 通过以上步骤,就可以实现两个RecyclerView之间的item互相拖拽了。可以在同一个Activity或Fragment中同时显示这两个RecyclerView,或者在不同的页面中分别显示这两个RecyclerView。这样用户就可以通过拖拽的方式,将一个RecyclerView的item拖放到另一个RecyclerView中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值