RecyclerView-- 侧滑删除和拖动排序

Posted 安卓笔记侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView-- 侧滑删除和拖动排序相关的知识,希望对你有一定的参考价值。

实现这么个功能我们不需要再去继承RecyclerView,只需要去了解ItemTouchHelper这个类即可,接下来我们就去看看都有些什么

ItemTouchHelper.Callback 默认需要实现三个方法:

getMovementFlags() 获取Touch的响应方向,包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags,都可以是上下左右,上面事例没有处理拖动所以传的是0,侧滑给的是ItemTouchHelper.LEFT,所以待会效果是向左滑动删除;

onMove() 拖动的时候会不断的回调这个方法,拖动的时候肯定需要不断的更新列表数据,达到一边拖动列表不断更新当前数据;

onSwiped() 侧滑删除之后的回调方法。

1.关键代码:

 1 // 实现左边侧滑删除 和 拖动排序
 2 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
 3     @Override
 4     public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
 5         // 获取触摸响应的方向   包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags
 6         // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
 7         int swipeFlags = ItemTouchHelper.LEFT;
 8 
 9 
10         // 拖动
11         int dragFlags = 0;
12         if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
13             // GridView 样式四个方向都可以
14             dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT |
15                     ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT;
16         } else {
17             // ListView 样式不支持左右
18             dragFlags = ItemTouchHelper.UP |
19                     ItemTouchHelper.DOWN;
20         }
21 
22         return makeMovementFlags(dragFlags, swipeFlags);
23     }
24 
25     /**
26      * 拖动的时候不断的回调方法
27      */
28     @Override
29     public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
30         // 获取原来的位置
31         int fromPosition = viewHolder.getAdapterPosition();
32         // 得到目标的位置
33         int targetPosition = target.getAdapterPosition();
34         if (fromPosition > targetPosition) {
35             for (int i = fromPosition; i < targetPosition; i++) {
36                 Collections.swap(mItems, i, i + 1);// 改变实际的数据集
37             }
38         } else {
39             for (int i = fromPosition; i > targetPosition; i--) {
40                 Collections.swap(mItems, i, i - 1);// 改变实际的数据集
41             }
42         }
43         mAdapter.notifyItemMoved(fromPosition, targetPosition);
44         return true;
45     }
46 
47     /**
48      * 侧滑删除后会回调的方法
49      */
50     @Override
51     public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
52         // 获取当前删除的位置
53         int position = viewHolder.getAdapterPosition();
54         mItems.remove(position);
55         // adapter 更新notify当前位置删除
56         mAdapter.notifyItemRemoved(position);
57     }
58 
59     /**
60      * 拖动选择状态改变回调
61      */
62     @Override
63     public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
64         if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
65             // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
66             // 侧滑或者拖动的时候背景设置为灰色
67             viewHolder.itemView.setBackgroundColor(Color.GRAY);
68         }
69     }
70 
71 
72     /**
73      * 回到正常状态的时候回调
74      */
75     @Override
76     public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
77         // 正常默认状态下背景恢复默认
78         viewHolder.itemView.setBackgroundColor(0);
79         ViewCompat.setTranslationX(viewHolder.itemView,0);
80     }
81 });
82 // 这个就不多解释了,就这么attach
83 itemTouchHelper.attachToRecyclerView(mRecyclerView);

 2.完整代码:

技术分享图片
  1 public class DragItemAnimatorActivity extends AppCompatActivity {
  2     private WrapRecyclerView mRecyclerView;
  3     private HomeAdapter mAdapter;
  4 
  5     private List<ItemBean> mItems = new ArrayList<ItemBean>();
  6 
  7     @Override
  8     protected void onCreate(Bundle savedInstanceState) {
  9         super.onCreate(savedInstanceState);
 10         setContentView(R.layout.activity_recycler_view);
 11 
 12         initData();
 13 
 14         mRecyclerView = (WrapRecyclerView) findViewById(R.id.recycler_view);
 15 
 16 
 17         mAdapter = new HomeAdapter(this, mItems);
 18 
 19         mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
 20         mRecyclerView.setAdapter(mAdapter);
 21 
 22         mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));
 23 
 24         final DefaultItemAnimator itemAnimator = new DefaultItemAnimator();
 25         mRecyclerView.setItemAnimator(itemAnimator);
 26 
 27         // 实现左边侧滑删除 和 拖动排序
 28         ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
 29             @Override
 30             public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
 31                 // 获取触摸响应的方向   包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags
 32                 // 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
 33                 int swipeFlags = ItemTouchHelper.LEFT;
 34 
 35 
 36                 // 拖动
 37                 int dragFlags = 0;
 38                 if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
 39                     // GridView 样式四个方向都可以
 40                     dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT |
 41                             ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT;
 42                 } else {
 43                     // ListView 样式不支持左右
 44                     dragFlags = ItemTouchHelper.UP |
 45                             ItemTouchHelper.DOWN;
 46                 }
 47 
 48                 return makeMovementFlags(dragFlags, swipeFlags);
 49             }
 50 
 51             /**
 52              * 拖动的时候不断的回调方法
 53              */
 54             @Override
 55             public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
 56                 // 获取原来的位置
 57                 int fromPosition = viewHolder.getAdapterPosition();
 58                 // 得到目标的位置
 59                 int targetPosition = target.getAdapterPosition();
 60                 if (fromPosition > targetPosition) {
 61                     for (int i = fromPosition; i < targetPosition; i++) {
 62                         Collections.swap(mItems, i, i + 1);// 改变实际的数据集
 63                     }
 64                 } else {
 65                     for (int i = fromPosition; i > targetPosition; i--) {
 66                         Collections.swap(mItems, i, i - 1);// 改变实际的数据集
 67                     }
 68                 }
 69                 mAdapter.notifyItemMoved(fromPosition, targetPosition);
 70                 return true;
 71             }
 72 
 73             /**
 74              * 侧滑删除后会回调的方法
 75              */
 76             @Override
 77             public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
 78                 // 获取当前删除的位置
 79                 int position = viewHolder.getAdapterPosition();
 80                 mItems.remove(position);
 81                 // adapter 更新notify当前位置删除
 82                 mAdapter.notifyItemRemoved(position);
 83             }
 84 
 85             /**
 86              * 拖动选择状态改变回调
 87              */
 88             @Override
 89             public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
 90                 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
 91                     // ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
 92                     // 侧滑或者拖动的时候背景设置为灰色
 93                     viewHolder.itemView.setBackgroundColor(Color.GRAY);
 94                 }
 95             }
 96 
 97 
 98             /**
 99              * 回到正常状态的时候回调
100              */
101             @Override
102             public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
103                 // 正常默认状态下背景恢复默认
104                 viewHolder.itemView.setBackgroundColor(0);
105                 ViewCompat.setTranslationX(viewHolder.itemView,0);
106             }
107         });
108         // 这个就不多解释了,就这么attach
109         itemTouchHelper.attachToRecyclerView(mRecyclerView);
110     }
111 
112     protected void initData() {
113         for (int i = 0; i < 10; i++) {
114             mItems.add(new ItemBean(i * 8 + 0, "收款", R.drawable.takeout_ic_category_brand));
115             mItems.add(new ItemBean(i * 8 + 1, "转账", R.drawable.takeout_ic_category_flower));
116             mItems.add(new ItemBean(i * 8 + 2, "余额宝", R.drawable.takeout_ic_category_fruit));
117             mItems.add(new ItemBean(i * 8 + 3, "手机充值", R.drawable.takeout_ic_category_medicine));
118             mItems.add(new ItemBean(i * 8 + 4, "医疗", R.drawable.takeout_ic_category_motorcycle));
119             mItems.add(new ItemBean(i * 8 + 5, "彩票", R.drawable.takeout_ic_category_public));
120             mItems.add(new ItemBean(i * 8 + 6, "电影", R.drawable.takeout_ic_category_store));
121             mItems.add(new ItemBean(i * 8 + 7, "游戏", R.drawable.takeout_ic_category_sweet));
122         }
123         mItems.add(new ItemBean(mItems.size(), "更多", R.drawable.takeout_ic_more));
124     }
125 
126     @Override
127     public boolean onCreateOptionsMenu(Menu menu) {
128         getMenuInflater().inflate(R.menu.main, menu);
129         return super.onCreateOptionsMenu(menu);
130     }
131 
132     @Override
133     public boolean onOptionsItemSelected(MenuItem item) {
134         switch (item.getItemId()) {
135             case R.id.id_action_gridview:
136                 mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
137                 break;
138             case R.id.id_action_listview:
139                 mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
140                 break;
141         }
142         return true;
143     }
144 
145     class HomeAdapter extends CommonRecyclerAdapter<ItemBean> {
146 
147 
148         public HomeAdapter(Context context, List<ItemBean> data) {
149             super(context, data, R.layout.item_drag_sort_delete);
150         }
151 
152         @Override
153         public void convert(ViewHolder holder, ItemBean item) {
154             holder.setText(R.id.item_text, item.text);
155             holder.setImageResource(R.id.item_img, item.icon);
156         }
157     }
158 
159     public class ItemBean {
160         public int id;
161         public String text;
162         public int icon;
163 
164         public ItemBean(int id, String text, int icon) {
165             this.id = id;
166             this.text = text;
167             this.icon = icon;
168         }
169     }
170 }
列表条目拖动排序和删除

 

技术分享图片
 

以上是关于RecyclerView-- 侧滑删除和拖动排序的主要内容,如果未能解决你的问题,请参考以下文章

Android使用ItemTouchHelper实现RecyclerView的item拖动位置交换和侧滑删除

Android使用ItemTouchHelper实现RecyclerView的item拖动位置交换和侧滑删除

Android基础控件——RecyclerView实现拖拽排序侧滑删除效果

Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能

RecyclerView上下拖动条目排序,左右划出屏幕删除条目的最简单的实现

第三方开源库-->RecyclerView 侧滑菜单(侧滑删除) 开源库整理