效果就是这样,RecyclerView列表可拖拽排序,可删除,可添加;

RecyclerView给我们提供了一个手势器:

  1. ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
  2. @Override
  3. public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  4. int dragFrlg = 0;
  5. if (recyclerView.getLayoutManager() instanceof GridLayoutManager){
  6. dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
  7. }else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
  8. dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
  9. }
  10. return makeMovementFlags(dragFrlg,0);
  11. }
  12. @Override
  13. public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
  14. //滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
  15. // Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
  16. // ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
  17. //得到当拖拽的viewHolder的Position
  18. int fromPosition = viewHolder.getAdapterPosition();
  19. //拿到当前拖拽到的item的viewHolder
  20. int toPosition = target.getAdapterPosition();
  21. if (fromPosition < toPosition) {
  22. for (int i = fromPosition; i < toPosition; i++) {
  23. Collections.swap(datas, i, i + 1);
  24. }
  25. } else {
  26. for (int i = fromPosition; i > toPosition; i--) {
  27. Collections.swap(datas, i, i - 1);
  28. }
  29. }
  30. ap.notifyItemMoved(fromPosition, toPosition);
  31. return true;
  32. }
  33. @Override
  34. public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
  35. //侧滑删除可以使用;
  36. }
  37. @Override
  38. public boolean isLongPressDragEnabled() {
  39. return true;
  40. }
  41. /**
  42. * 长按选中Item的时候开始调用
  43. * 长按高亮
  44. * @param viewHolder
  45. * @param actionState
  46. */
  47. @Override
  48. public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
  49. if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
  50. viewHolder.itemView.setBackgroundColor(Color.RED);
  51. //获取系统震动服务//震动70毫秒
  52. Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
  53. vib.vibrate(70);
  54. }
  55. super.onSelectedChanged(viewHolder, actionState);
  56. }
  57. /**
  58. * 手指松开的时候还原高亮
  59. * @param recyclerView
  60. * @param viewHolder
  61. */
  62. @Override
  63. public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  64. super.clearView(recyclerView, viewHolder);
  65. viewHolder.itemView.setBackgroundColor(0);
  66. ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
  67. }
  68. });

设置给RecyclerView即可:

  1. helper.attachToRecyclerView(rv);

下面是完整的代码和Xml布局文件:

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2. private final String TAG = this.getClass().getSimpleName();
  3. private List<String> d = Arrays.asList(
  4. "A","B","C","D","E","F","G"
  5. ,"H","I","J","K","L","M","N"
  6. ,"O","P","Q","R","S","T"
  7. ,"U","V","W","X","Y","Z");
  8. private RecyclerView rv ;
  9. private Ap<String> ap;
  10. private List<String> datas;
  11. private EditText edAdd;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. initData();
  17. rv = findViewById(R.id.rv);
  18. edAdd =findViewById(R.id.et_add);
  19. rv.setLayoutManager(new GridLayoutManager(this,3));
  20. // rv.setLayoutManager(new LinearLayoutManager(this));
  21. ap = new Ap(this, datas);
  22. rv.setAdapter(ap);
  23. helper.attachToRecyclerView(rv);
  24. findViewById(R.id.tv).setOnClickListener(this);
  25. findViewById(R.id.tv_add).setOnClickListener(this);
  26. }
  27. private void initData() {
  28. datas = new ArrayList<>();
  29. // 直接用d操作集合会崩溃,Arrays.asList集合不可增删改;详细可以看我的博客
  30. for (int i = 0; i < d.size(); i++) {
  31. datas.add(d.get(i));
  32. }
  33. }
  34. @Override
  35. public void onClick(View view) {
  36. switch (view.getId()){
  37. case R.id.tv:
  38. for (int i = 0; i < datas.size(); i++) {
  39. Log.i(TAG, "onClick: ____"+datas.get(i));
  40. }
  41. break;
  42. case R.id.tv_add:
  43. ap.add(edAdd.getText().toString().trim());
  44. edAdd.setText(null);
  45. break;
  46. }
  47. }
  48. class Ap<T> extends RecyclerView.Adapter<Ap.Vh>{
  49. private Context context;
  50. public List<T> stringList;
  51. public Ap(Context context, List<T> stringList) {
  52. this.context = context;
  53. this.stringList = stringList;
  54. }
  55. @Override
  56. public Ap.Vh onCreateViewHolder(ViewGroup parent, int viewType) {
  57. return new Vh(LayoutInflater.from(context).inflate(R.layout.item_rv,null));
  58. }
  59. @Override
  60. public void onBindViewHolder(Ap.Vh holder, final int position) {
  61. holder.tv.setText(stringList.get(position).toString());
  62. holder.iv.setOnClickListener(new View.OnClickListener() {
  63. @Override
  64. public void onClick(View view) {
  65. remove(position);
  66. }
  67. });
  68. }
  69. @Override
  70. public int getItemCount() {
  71. return stringList.size();
  72. }
  73. public void add(T item){
  74. int position = stringList.size();
  75. stringList.add(item);
  76. notifyItemInserted(position);
  77. }
  78. public void add(int position,T item){
  79. stringList.add(position,item);
  80. notifyItemInserted(position);
  81. }
  82. // public void remove(T item) {
  83. // final int position = stringList.indexOf(item);
  84. // if (-1 == position)
  85. // return;
  86. // stringList.remove(item);
  87. // notifyItemRemoved(position);
  88. // }
  89. public void remove(int position) {
  90. stringList.remove(position);
  91. notifyItemRemoved(position);
  92. notifyItemRangeChanged(position,stringList.size());
  93. }
  94. class Vh extends RecyclerView.ViewHolder {
  95. public Vh(View itemView) {
  96. super(itemView);
  97. tv = itemView.findViewById(R.id.tv);
  98. iv = itemView.findViewById(R.id.iv_delete);
  99. }
  100. public TextView tv;
  101. public ImageView iv;
  102. }
  103. }
  104. ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
  105. @Override
  106. public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  107. int dragFrlg = 0;
  108. if (recyclerView.getLayoutManager() instanceof GridLayoutManager){
  109. dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
  110. }else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
  111. dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
  112. }
  113. return makeMovementFlags(dragFrlg,0);
  114. }
  115. @Override
  116. public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
  117. //滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
  118. // Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
  119. // ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
  120. //得到当拖拽的viewHolder的Position
  121. int fromPosition = viewHolder.getAdapterPosition();
  122. //拿到当前拖拽到的item的viewHolder
  123. int toPosition = target.getAdapterPosition();
  124. if (fromPosition < toPosition) {
  125. for (int i = fromPosition; i < toPosition; i++) {
  126. Collections.swap(datas, i, i + 1);
  127. }
  128. } else {
  129. for (int i = fromPosition; i > toPosition; i--) {
  130. Collections.swap(datas, i, i - 1);
  131. }
  132. }
  133. ap.notifyItemMoved(fromPosition, toPosition);
  134. return true;
  135. }
  136. @Override
  137. public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
  138. //侧滑删除可以使用;
  139. }
  140. @Override
  141. public boolean isLongPressDragEnabled() {
  142. return true;
  143. }
  144. /**
  145. * 长按选中Item的时候开始调用
  146. * 长按高亮
  147. * @param viewHolder
  148. * @param actionState
  149. */
  150. @Override
  151. public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
  152. if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
  153. viewHolder.itemView.setBackgroundColor(Color.RED);
  154. //获取系统震动服务//震动70毫秒
  155. Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
  156. vib.vibrate(70);
  157. }
  158. super.onSelectedChanged(viewHolder, actionState);
  159. }
  160. /**
  161. * 手指松开的时候还原高亮
  162. * @param recyclerView
  163. * @param viewHolder
  164. */
  165. @Override
  166. public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
  167. super.clearView(recyclerView, viewHolder);
  168. viewHolder.itemView.setBackgroundColor(0);
  169. ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
  170. }
  171. });
  172. }

Xml布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context="com.ccb.pactera.dragrecyclerviewdemo.MainActivity">
  8. <LinearLayout
  9. android:id="@+id/ll"
  10. android:background="#eeeeee"
  11. android:orientation="horizontal"
  12. android:layout_width="match_parent"
  13. android:layout_height="48dp">
  14. <TextView
  15. android:layout_width="0dp"
  16. android:layout_weight="1"
  17. android:layout_height="48dp"
  18. android:id="@+id/tv"
  19. android:text="查看数据"
  20. android:textColor="#fff"
  21. android:textSize="16dp"
  22. android:gravity="center"
  23. android:background="@color/colorAccent"
  24. />
  25. <EditText
  26. android:id="@+id/et_add"
  27. android:layout_width="0dp"
  28. android:layout_height="match_parent"
  29. android:layout_weight="1"/>
  30. <TextView
  31. android:layout_width="0dp"
  32. android:layout_weight="1"
  33. android:layout_height="48dp"
  34. android:id="@+id/tv_add"
  35. android:text="添加数据"
  36. android:textColor="#fff"
  37. android:textSize="16dp"
  38. android:gravity="center"
  39. android:background="#fc1"
  40. />
  41. </LinearLayout>
  42. <android.support.v7.widget.RecyclerView
  43. android:id="@+id/rv"
  44. android:layout_below="@id/ll"
  45. android:layout_width="match_parent"
  46. android:layout_height="match_parent" />
  47. </RelativeLayout>

RecyclerView的Item:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:background="#f1f1f1"
  5. android:layout_height="match_parent">
  6. <RelativeLayout
  7. android:layout_width="match_parent"
  8. android:background="#fff"
  9. android:layout_margin="0.5dp"
  10. android:layout_height="match_parent">
  11. <ImageView
  12. android:layout_width="match_parent"
  13. android:layout_height="50dp"
  14. android:src="@mipmap/icon"
  15. android:id="@+id/iv"
  16. android:layout_marginTop="10dp"
  17. />
  18. <TextView
  19. android:id="@+id/tv"
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content"
  22. android:textSize="16dp"
  23. android:layout_below="@id/iv"
  24. android:gravity="center_horizontal"
  25. android:layout_marginBottom="10dp"
  26. />
  27. <ImageView
  28. android:layout_width="25dp"
  29. android:layout_height="25dp"
  30. android:layout_alignParentRight="true"
  31. android:src="@mipmap/detele"
  32. android:id="@+id/iv_delete"
  33. />
  34. </RelativeLayout>
  35. </RelativeLayout>

资源链接Github:https://github.com/CuiChenbo/DragRecyclerViewDemo

RecyclerView拖拽排序;的更多相关文章

  1. RecyclerView拖拽排序和滑动删除实现

    效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...

  2. RecyclerViewItemTouchHelperDemo【使用ItemTouchHelper进行拖拽排序功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录使用ItemTouchHelper对Recyclerview进行拖拽排序功能的实现. 效果图 代码分析 ItemTouchHel ...

  3. dragsort html拖拽排序

    一.Jquery List DragSort 对于有些页面,如首页的定制,需要进行动态的拖拽排序.由于自己实现比较困难,我们一般会使用一些js插件来实现.dragsort 就是帮助我们完成这一需求.通 ...

  4. jQuery可拖拽排序列表jquery-sortable-lists

    jquery-sortable-lists可以通过鼠标进行拖动排列树型菜单,可以定义某个列表元素是否拖动,拖动后回调,点击可以折叠树型结点,可以用来在后台模仿wordpress后台拖动菜单,实现多级菜 ...

  5. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  6. ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)

    ztree这个系列的最后一篇,也是ztree功能强大的体现之中的一个--排序功能. ztree能够实现全部节点之间任意的拖拽排序功能.我这里依据须要实现了仅仅同意同级之间任意拖拽排序,事实上原理都一样 ...

  7. jquery sortTable拖拽排序

    所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象   ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象   ...

  8. ListView列表拖拽排序

    ListView列表拖拽排序能够參考Android源代码下的Music播放列表,他是能够拖拽的,源代码在[packages/apps/Music下的TouchInterceptor.java下]. 首 ...

  9. zTree的拖拽排序

    ztree本身是可以支持拖拽的,但是却没有找到明确的支持拖拽的排序,也就是说,在拖拽过程中,需要自定义维护拖拽后的顺序并保存至后台. 在这样一个比较常规的需求情况下,网上也有朋友给出了一些解决方案,比 ...

随机推荐

  1. Qt开发问答

    Qt开发问答 1, Difference between Dialog and widget and QMainWindow http://www.qtcentre.org/threads/3465- ...

  2. mysql之 重建GTID下主从关系

    主库:mysqldump -uroot -pmysql -S /tmp/mysql.sock1 --single-transaction --add-drop-database --master-da ...

  3. ES9新特性

    这篇文章主要介绍ES2018(ES9)的新特性, 以及使用方法 JS是一门跨平台的语言, ES6也就是ECMAScript 2015 花费了5年的时间敲定, 是一次非常大的改版, 之后每年都有一个小版 ...

  4. https ssl 请求过程详解

    http  协议:http 协议是一种无状态,短链接的 通信协议,http 协议建立在 tcp 协议之上. http 协议 分成 三个 部分 请求行,请求头,请求体 请求行: 就是访问的地址 ( 包含 ...

  5. 如何编译运行HanLP自然语言处理包

    master分支 对于master分支,编译方法如下: git clone  https://github.com/hankcs/HanLP.git mvn install -DskipTests · ...

  6. hanlp自然语言处理包的基本使用--python

    hanlp拥有:中文分词.命名实体识别.摘要关键字.依存句法分析.简繁拼音转换.智能推荐. 这里主要介绍一下hanlp的中文分词.命名实体识别.依存句法分析,这里就不介绍具体的hanlp的安装了,百度 ...

  7. 自定义自己的jQury插件

    对于一个商业插件来说,自定义插件的样式是必不可少的.我们可以通过我们自己输入不同的样式,来改变开发者的默认样式.比如说最常见的 width.height.url.color等等.要是没有这些自定义的东 ...

  8. SpringCloud之实现客户端的负载均衡Ribbon(二)

    一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...

  9. ALGO-143_蓝桥杯_算法训练_字符串变换

    问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,,,,5这5个参数分别指代不同的5种字符串操作, ...

  10. 问题解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

    转载:y小川 SettingWithCopyWarning 解决方案 问题场景:我在读取csv文件之后,因为要新增一个特征列并根据已有特征修改新增列的值,结果在修改的时候就碰到了SettingWith ...