当前位置:   article > 正文

RecycleView长按拖动控件 ItemTouchHelper.Callback

itemtouchhelper

1.Adapter

继承RecycleView.Adapter

其实RecycleView实现长按拖动控件并不难,只要重写 ItemTouchHelper.Callback就好,ItemTouchHelper 是实现 RecyclerView 侧滑删除和拖拽移动的工具类。

下面的代码除了ItemTouchHelper.Callback就是普通的RecycleView.Adapter实现过程。

  1. public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.Holder>{
  2. private Context context;
  3. private ItemTouchHelper itemTouchHelper;
  4. public ItemAdapter(Context context) {
  5. this.context=context;
  6. itemTouchHelper = new ItemTouchHelper(callback);//实例化ItemTouchHelper
  7. }
  8. @NonNull
  9. @Override
  10. public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  11. return new Holder(LayoutInflater.from(context).inflate(R.layout.item, parent, false));
  12. }
  13. @Override
  14. public void onBindViewHolder(@NonNull Holder holder, int position) {
  15. String text = position+"";
  16. holder.textView.setText(text);
  17. }
  18. @Override
  19. public int getItemCount() {
  20. return 10;
  21. }
  22. public ItemTouchHelper getItemTouchHelper(){
  23. return itemTouchHelper;
  24. }
  25. public static class Holder extends RecyclerView.ViewHolder{
  26. private TextView textView;
  27. public Holder(@NonNull View itemView) {
  28. super(itemView);
  29. textView=itemView.findViewById(R.id.textview);
  30. }
  31. }
  32. private final ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() {
  33. // @Override
  34. // public boolean isLongPressDragEnabled() {
  35. // return true;
  36. // }
  37. @Override
  38. public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
  39. //允许组件上下移动,以及向左滑动
  40. return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT);
  41. }
  42. @Override
  43. public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
  44. return false;
  45. }
  46. @Override
  47. public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
  48. }
  49. };
  50. }

重点看实现拖拽的代码:

  1. private final ItemTouchHelper.Callback callback = new ItemTouchHelper.Callback() {
  2. // @Override
  3. // public boolean isLongPressDragEnabled() {
  4. // return true;
  5. // }
  6. @Override
  7. public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
  8. //允许组件上下移动,以及向左滑动
  9. return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT);
  10. }
  11. @Override
  12. public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
  13. return false;
  14. }
  15. @Override
  16. public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
  17. }
  18. };

这三个方法是必须重写的

getMovementFlags

getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder)

一般可以

return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT); 

makeMovementFlags(int dragFlags, int swipeFlags)
dragFlags:可以拖动的方向 swipeFlags:可以滑动的方向 

onMove

onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target)

拖拽一个item从旧位置移动到新位置时调用。

 onSwiped

当用户侧滑删除某项时 onSwiped() 方法会被回调。

2.创建实例

创建ItemTouchHelper.Callback实例以及ItemTouchHelper实例

  1. public class MainActivity extends AppCompatActivity {
  2. private RecyclerView recyclerView;
  3. private ItemAdapter itemAdapter;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_recycle_view);
  8. recyclerView = findViewById(R.id.recycle_view);
  9. itemAdapter = new ItemAdapter(this); //实例化adapter
  10. //RecyclerView与ItemTouchHelper相互绑定
  11. itemAdapter.getItemTouchHelper().attachToRecyclerView(recyclerView);
  12. //设置adapter
  13. recyclerView.setAdapter(itemAdapter);
  14. //设置LayoutManager,不然item不会显示!!!
  15. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  16. }
  17. }

实现效果图:

左:初始图

右:滑动6过程图

我想把6拖动到9下面,但实际上松手后会恢复左图,也就是说我只实现了拖动,item的位置并不能变化。

3.实现控件位置变化

重写

onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target)
  1. @Override
  2. public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
  3. notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
  4. return true; //有文章说返回false位置不能交换,我试了之后可以交换位置
  5. }

调用 notifyItemMoved() 交换位置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/286809
推荐阅读
相关标签
  

闽ICP备14008679号