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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值