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

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

 ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFrlg = 0;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager){
dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
}else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
}
return makeMovementFlags(dragFrlg,0);
} @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
// Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
// ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition()); //得到当拖拽的viewHolder的Position
int fromPosition = viewHolder.getAdapterPosition();
//拿到当前拖拽到的item的viewHolder
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(datas, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(datas, i, i - 1);
}
}
ap.notifyItemMoved(fromPosition, toPosition);
return true;
} @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//侧滑删除可以使用;
} @Override
public boolean isLongPressDragEnabled() {
return true;
}
/**
* 长按选中Item的时候开始调用
* 长按高亮
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.RED);
//获取系统震动服务//震动70毫秒
Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(70);
}
super.onSelectedChanged(viewHolder, actionState);
} /**
* 手指松开的时候还原高亮
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(0);
ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
}
});

设置给RecyclerView即可:

helper.attachToRecyclerView(rv);

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final String TAG = this.getClass().getSimpleName();
private List<String> d = Arrays.asList(
"A","B","C","D","E","F","G"
,"H","I","J","K","L","M","N"
,"O","P","Q","R","S","T"
,"U","V","W","X","Y","Z");
private RecyclerView rv ;
private Ap<String> ap;
private List<String> datas;
private EditText edAdd; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
rv = findViewById(R.id.rv);
edAdd =findViewById(R.id.et_add);
rv.setLayoutManager(new GridLayoutManager(this,3));
// rv.setLayoutManager(new LinearLayoutManager(this));
ap = new Ap(this, datas);
rv.setAdapter(ap);
helper.attachToRecyclerView(rv);
findViewById(R.id.tv).setOnClickListener(this);
findViewById(R.id.tv_add).setOnClickListener(this);
} private void initData() {
datas = new ArrayList<>();
// 直接用d操作集合会崩溃,Arrays.asList集合不可增删改;详细可以看我的博客
for (int i = 0; i < d.size(); i++) {
datas.add(d.get(i));
}
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.tv:
for (int i = 0; i < datas.size(); i++) {
Log.i(TAG, "onClick: ____"+datas.get(i));
}
break;
case R.id.tv_add:
ap.add(edAdd.getText().toString().trim());
edAdd.setText(null);
break;
}
} class Ap<T> extends RecyclerView.Adapter<Ap.Vh>{
private Context context;
public List<T> stringList;
public Ap(Context context, List<T> stringList) {
this.context = context;
this.stringList = stringList;
} @Override
public Ap.Vh onCreateViewHolder(ViewGroup parent, int viewType) {
return new Vh(LayoutInflater.from(context).inflate(R.layout.item_rv,null));
} @Override
public void onBindViewHolder(Ap.Vh holder, final int position) {
holder.tv.setText(stringList.get(position).toString());
holder.iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
remove(position);
}
});
} @Override
public int getItemCount() {
return stringList.size();
} public void add(T item){
int position = stringList.size();
stringList.add(item);
notifyItemInserted(position);
} public void add(int position,T item){
stringList.add(position,item);
notifyItemInserted(position);
}
// public void remove(T item) {
// final int position = stringList.indexOf(item);
// if (-1 == position)
// return;
// stringList.remove(item);
// notifyItemRemoved(position);
// } public void remove(int position) {
stringList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,stringList.size());
} class Vh extends RecyclerView.ViewHolder { public Vh(View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
iv = itemView.findViewById(R.id.iv_delete);
}
public TextView tv;
public ImageView iv;
}
} ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFrlg = 0;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager){
dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
}else if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
dragFrlg = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
}
return makeMovementFlags(dragFrlg,0);
} @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//滑动事件 下面注释的代码,滑动后数据和条目错乱,被舍弃
// Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());
// ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition()); //得到当拖拽的viewHolder的Position
int fromPosition = viewHolder.getAdapterPosition();
//拿到当前拖拽到的item的viewHolder
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(datas, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(datas, i, i - 1);
}
}
ap.notifyItemMoved(fromPosition, toPosition);
return true;
} @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//侧滑删除可以使用;
} @Override
public boolean isLongPressDragEnabled() {
return true;
}
/**
* 长按选中Item的时候开始调用
* 长按高亮
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.RED);
//获取系统震动服务//震动70毫秒
Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(70);
}
super.onSelectedChanged(viewHolder, actionState);
} /**
* 手指松开的时候还原高亮
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(0);
ap.notifyDataSetChanged(); //完成拖动后刷新适配器,这样拖动后删除就不会错乱
}
});
}

Xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ccb.pactera.dragrecyclerviewdemo.MainActivity"> <LinearLayout
android:id="@+id/ll"
android:background="#eeeeee"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="48dp">
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="48dp"
android:id="@+id/tv"
android:text="查看数据"
android:textColor="#fff"
android:textSize="16dp"
android:gravity="center"
android:background="@color/colorAccent"
/>
<EditText
android:id="@+id/et_add"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="48dp"
android:id="@+id/tv_add"
android:text="添加数据"
android:textColor="#fff"
android:textSize="16dp"
android:gravity="center"
android:background="#fc1"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_below="@id/ll"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>

RecyclerView的Item:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#f1f1f1"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:background="#fff"
android:layout_margin="0.5dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="50dp"
android:src="@mipmap/icon"
android:id="@+id/iv"
android:layout_marginTop="10dp"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16dp"
android:layout_below="@id/iv"
android:gravity="center_horizontal"
android:layout_marginBottom="10dp"
/>
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentRight="true"
android:src="@mipmap/detele"
android:id="@+id/iv_delete"
/>
</RelativeLayout>
</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. BTrace学习总结

    一.简介: 在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉.一般情况下是通过修改程序,添加打印日志:然后重新发布程序来完成.然而,这不仅麻烦,而且带来很多不可控的因素.有没有一种方 ...

  2. Spring技术内幕总结 - AOP概述

    AOP是Aspect-Oriented Programming(面向方面/切面编程)的简称.Aspect是一种新的模块化机制,用来描述分散在对象.类或函数中的横切关注点.分离关注点使解决特定领域问题的 ...

  3. MYSQL 中的 int(11) 到底代表什么意思?

    各 INT 类型无符号最大值用单位表示: INT 类型 无符号最大值用单位表示 TINYINT 255 SMALLINT 65535 MEDIUMINT 1677 万 INT 42 亿 BIGINT ...

  4. express 与 koa 区别

    express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...

  5. activemq jms使用

    activemq 是 基于 jms 协议的 消息队列 消息 流程: jsm 的 消息流程鼻尖简单  生产者发送消息到目的地,消费者 监听这个目的地,然后收到消息. 相比 amqp 的 消息流程简单很多 ...

  6. 相似度与距离计算python代码实现

    #定义几种距离计算函数 #更高效的方式为把得分向量化之后使用scipy中定义的distance方法 from math import sqrt def euclidean_dis(rating1, r ...

  7. 利用ST MCU内部基准参考电压监测电源电压及其它

    在使用ST MCU开发过程中,有人问如果电源电压是变动的,询问有无办法用比较简洁的办法对电源电压进行监测,或者说电源电压波动情况下能否检测出其它待测的AD输入电压. 这里跟大家分享交流一个方法.就是在 ...

  8. Linux重定向及nohup不输出的方法

    转载自:http://blog.csdn.net/qinglu000/article/details/18963031   先说一下linux重定向: 0.1和2分别表示标准输入.标准输出和标准错误信 ...

  9. windows系统如何设置域名解析

      C:\Windows\System32\drivers\etc        

  10. Video Timing Controller v6.1软件调试记录

    Video Timing Controller v6.1软件调试记录 GUI配置: . case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlace ...