RecyclerView拖动及拖动后position错乱问题

之前在做一个App自定义顺序的功能,用户需要拖动App到自己想要的位置,刚开始一切都写好之后,拖动么有问题当排序之后发现位置完全错乱了,根本不是我们想要的顺序,所以今天就把这个坑分享出来,也给自己做个记录。

 

定义接口记录拖动前后的位置:

public interface ItemTouchHelperAdapter {

    //数据交换前后位置
    void onItemMove(int fromPosition, int toPosition);

}

实现接口:

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private ItemTouchHelperAdapter mAdapter;
    private boolean sort = false;

    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
        mAdapter = adapter;
    }

    /*
     * 用于返回可以滑动的方向
     * */
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

        int dragFlags = ItemTouchHelper.UP 
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现RecyclerView之间的拖拽可以使用ItemTouchHelper类。具体实现步骤如下: 1. 创建一个继承自ItemTouchHelper.Callback的类,该类负责处理拖拽和滑动事件。 2. 在该类中重写getMovementFlags方法,指定可以处理哪些拖拽和滑动事件。 3. 在该类中重写onMove方法,处理RecyclerView之间的拖拽事件。 4. 在该类中重写onSwiped方法,处理RecyclerView中的滑动事件。 5. 将该类与RecyclerView绑定,在RecyclerViewItemTouchHelper.Callback参数中传入该类的实例。 关于跨布局拖拽,可以考虑在getItemViewType方法中返回不同的布局类型,然后在onMove方法中处理不同类型布局之间的拖拽事件。 具体实现可以参考以下示例代码: ```java public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback { private OnItemMoveListener mListener; public MyItemTouchHelperCallback(OnItemMoveListener listener) { mListener = listener; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; return makeMovementFlags(dragFlags, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { if (viewHolder.getItemViewType() == target.getItemViewType()) { return mListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); } return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { mListener.onItemDismiss(viewHolder.getAdapterPosition()); } public interface OnItemMoveListener { boolean onItemMove(int fromPosition, int toPosition); void onItemDismiss(int position); } } ``` 在getItemViewType方法中返回不同的布局类型: ```java @Override public int getItemViewType(int position) { if (mData.get(position) instanceof Type1) { return TYPE_1; } else { return TYPE_2; } } ``` 在Activity或Fragment中将该类与RecyclerView绑定: ```java MyItemTouchHelperCallback callback = new MyItemTouchHelperCallback(listener); ItemTouchHelper touchHelper = new ItemTouchHelper(callback); touchHelper.attachToRecyclerView(recyclerView); ``` 其中listener是一个实现了OnItemMoveListener接口的类,用于处理拖拽和滑动事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值