ItemTouchHelper基本用法

         ItemTouchHelper是谷歌提供的用于实现Recyclerview 拖拽效果的帮助类,今天我们来学习下它的基本用法

首先ItemTouchHelper需要实现它的一个内部抽象类CallBack

 

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private IMoveAndSwipeCallback iMoveAndSwipeCallback;

    public void setiMoveAndSwipeCallback(IMoveAndSwipeCallback iMoveAndSwipeCallback) {
        this.iMoveAndSwipeCallback = iMoveAndSwipeCallback;
    }

    /**
     * 设置拖拽和item滑动的可支持方向
     *
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //支持上下拖拽
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //item支持左滑
        final int swipeFlags = ItemTouchHelper.LEFT;

        return makeMovementFlags(dragFlags, swipeFlags);
    }

    /**
     * 拖拽结束后(手指抬起)会回调的方法
     * 
     * @param recyclerView
     * @param viewHolder 手指拖拽的item
     * @param viewHolder1 移动到的item
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
        if (iMoveAndSwipeCallback != null) {
            iMoveAndSwipeCallback.onMove(viewHolder.getAdapterPosition(), viewHolder1.getAdapterPosition());
        }
        return true;
    }

    /**
     * 侧滑回调
     * 
     * @param viewHolder
     * @param swipeDir 方向
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int swipeDir) {
        if (iMoveAndSwipeCallback != null) {
            iMoveAndSwipeCallback.onSwiped(viewHolder.getAdapterPosition());
        }
    }
}

主要用到三个方法,getMovementFlags方法用于确定支持的拖拽方向和侧滑方向,onMove方法是拖拽结束后(手指抬起)会回调的方法,onSwiped则是侧滑回调,我这边还用了一个接口来给外部调用监听onMove和onSwiped

 

/**
 * 拖拽和侧滑抽象接口
 */
public interface IMoveAndSwipeCallback {
    void onMove(int prePosition, int postPosition);

    void onSwiped(int position);
}

接下是我们在Activity中给RecyclerView设置ItemTouchHelper

 

public class ItemTouchHelperActivity extends AppCompatActivity implements IMoveAndSwipeCallback {
    RecyclerView rv;
    private List<String> strings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item_touch_helper);

        rv = findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        rv.addItemDecoration(new MyDecoration(this, MyDecoration.HORIZONTAL_LIST));

        initData();
        MyAdapter myAdapter = new MyAdapter(this);
        rv.setAdapter(myAdapter);

        //给RecyclerView设置ItemTouchHelper
        ItemTouchHelperCallback itemTouchHelperCallback = new ItemTouchHelperCallback();
        itemTouchHelperCallback.setiMoveAndSwipeCallback(this);
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
        itemTouchHelper.attachToRecyclerView(rv);
    }

    private void initData() {
        strings = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            strings.add(String.valueOf(i));
        }
    }

    @Override
    public void onMove(int prePosition, int postPosition) {
        Collections.swap(strings, prePosition, postPosition);
        if (rv.getAdapter() != null) {
            rv.getAdapter().notifyItemMoved(prePosition, postPosition);
        }
    }

    @Override
    public void onSwiped(int position) {
        strings.remove(position);
        if (rv.getAdapter() != null) {
            rv.getAdapter().notifyItemRemoved(position);
        }
    }

    class MyAdapter extends RecyclerView.Adapter {
        private Context context;

        public MyAdapter(Context context) {
            this.context = context;
        }

        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_text, viewGroup, false));
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
            myViewHolder.tv.setText(strings.get(i));
        }

        @Override
        public int getItemCount() {
            return strings.size();
        }

        class MyViewHolder extends RecyclerView.ViewHolder {
            public TextView tv;

            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                tv = itemView.findViewById(R.id.tv);
            }
        }
    }
}




转自:https://www.jianshu.com/p/d36f8f01a10d
 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ItemTouchHelper` 并不会传递 `TouchEvent` 给 `RecyclerView`,而是通过拦截 `RecyclerView` 中的触摸事件来实现拖拽和滑动操作。在 `ItemTouchHelper.Callback` 中的 `onMove` 和 `onSwiped` 方法中,我们可以根据用户的操作来更新数据源,并调用相应的方法来更新 UI。 以下是一个示例代码,用于在 `ItemTouchHelper.Callback` 中实现拖拽操作: ```java ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 当 Item 被拖拽时,调用此方法 // 在此方法中,可以更新数据源,并调用 notifyItemMoved 方法更新 UI // 返回 true 表示已经处理了此事件 return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 当 Item 被滑动时,调用此方法 // 在此方法中,可以更新数据源,并调用 notifyItemRemoved 方法更新 UI } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { // 当 Item 被选中时,调用此方法 // 在此方法中,可以为 Item 添加动画效果 } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { // 当 Item 被拖拽时,调用此方法 // 在此方法中,可以为 Item 添加动画效果 } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 当 Item 被释放时,调用此方法 // 在此方法中,可以为 Item 添加动画效果 } }; ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(recyclerView); ``` 在此代码中,我们重写了 `ItemTouchHelper.Callback` 中的方法来实现拖拽和滑动操作。在 `onMove` 方法中,我们可以更新数据源,并调用 `notifyItemMoved` 方法来更新 UI。在 `onSwiped` 方法中,我们可以更新数据源,并调用 `notifyItemRemoved` 方法来更新 UI。最后,我们将 `ItemTouchHelper` 添加到 `RecyclerView` 中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值