博客
关于我
ItemTouchHelper基本用法
阅读量:138 次
发布时间:2019-02-27

本文共 4349 字,大约阅读时间需要 14 分钟。

ItemTouchHelper是谷歌提供的一款用于实现RecyclerView拖拽效果的帮助类,今天我们将深入学习其基本用法。

ItemTouchHelper Callback接口

首先,ItemTouchHelper需要我们实现一个内部抽象类Callback。我们可以创建一个新的Callback类,用于处理拖拽和滑动操作。以下是一个典型的实现示例:

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {    private IMoveAndSwipeCallback iMoveAndSwipeCallback;    public void setiMoveAndSwipeCallback(IMoveAndSwipeCallback iMoveAndSwipeCallback) {        this.iMoveAndSwipeCallback = iMoveAndSwipeCallback;    }    @Override    public int getMovementFlags(            @NonNull RecyclerView recyclerView,            @NonNull RecyclerView.ViewHolder viewHolder    ) {        // 支持上下拖拽        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;        // 项支持左滑        final int swipeFlags = ItemTouchHelper.LEFT;        return makeMovementFlags(dragFlags, swipeFlags);    }    @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;    }    @Override    public void onSwiped(            @NonNull RecyclerView.ViewHolder viewHolder,            int swipeDir    ) {        if (iMoveAndSwipeCallback != null) {            iMoveAndSwipeCallback.onSwiped(viewHolder.getAdapterPosition());        }    }}

IMoveAndSwipeCallback接口

为了让外部能够监听拖拽和滑动操作,我们创建了一个接口IMoveAndSwipeCallback。该接口包含两个方法:

public interface IMoveAndSwipeCallback {    void onMove(int prePosition, int postPosition);    void onSwiped(int position);}

Activity中的使用

接下来,我们将ItemTouchHelper在Activity中应用。以下是一个典型的实现示例:

public class ItemTouchHelperActivity extends AppCompatActivity implements IMoveAndSwipeCallback {    RecyclerView rv;    private List
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); 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); } }}

MyAdapter类

为了实现数据的动态更新,我们创建了一个自定义的RecyclerView.Adapter类:

public 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);        }    }}

通过以上代码示例,我们可以清晰地看到ItemTouchHelper在RecyclerView中的应用场景。拖拽和滑动操作通过Callback接口进行监听和处理,实现了灵活的数据交互。

转载地址:http://zxub.baihongyu.com/

你可能感兴趣的文章