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

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

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

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

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

1.关键代码:

 // 实现左边侧滑删除 和 拖动排序
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags
// 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
int swipeFlags = ItemTouchHelper.LEFT; // 拖动
int dragFlags = ;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
// GridView 样式四个方向都可以
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT |
ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT;
} else {
// ListView 样式不支持左右
dragFlags = ItemTouchHelper.UP |
ItemTouchHelper.DOWN;
} return makeMovementFlags(dragFlags, swipeFlags);
} /**
* 拖动的时候不断的回调方法
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// 获取原来的位置
int fromPosition = viewHolder.getAdapterPosition();
// 得到目标的位置
int targetPosition = target.getAdapterPosition();
if (fromPosition > targetPosition) {
for (int i = fromPosition; i < targetPosition; i++) {
Collections.swap(mItems, i, i + );// 改变实际的数据集
}
} else {
for (int i = fromPosition; i > targetPosition; i--) {
Collections.swap(mItems, i, i - );// 改变实际的数据集
}
}
mAdapter.notifyItemMoved(fromPosition, targetPosition);
return true;
} /**
* 侧滑删除后会回调的方法
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 获取当前删除的位置
int position = viewHolder.getAdapterPosition();
mItems.remove(position);
// adapter 更新notify当前位置删除
mAdapter.notifyItemRemoved(position);
} /**
* 拖动选择状态改变回调
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
// ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
// 侧滑或者拖动的时候背景设置为灰色
viewHolder.itemView.setBackgroundColor(Color.GRAY);
}
} /**
* 回到正常状态的时候回调
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 正常默认状态下背景恢复默认
viewHolder.itemView.setBackgroundColor();
ViewCompat.setTranslationX(viewHolder.itemView,);
}
});
// 这个就不多解释了,就这么attach
itemTouchHelper.attachToRecyclerView(mRecyclerView);

2.完整代码:

 public class DragItemAnimatorActivity extends AppCompatActivity {
private WrapRecyclerView mRecyclerView;
private HomeAdapter mAdapter; private List<ItemBean> mItems = new ArrayList<ItemBean>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view); initData(); mRecyclerView = (WrapRecyclerView) findViewById(R.id.recycler_view); mAdapter = new HomeAdapter(this, mItems); mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
mRecyclerView.setAdapter(mAdapter); mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this)); final DefaultItemAnimator itemAnimator = new DefaultItemAnimator();
mRecyclerView.setItemAnimator(itemAnimator); // 实现左边侧滑删除 和 拖动排序
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 获取触摸响应的方向 包含两个 1.拖动dragFlags 2.侧滑删除swipeFlags
// 代表只能是向左侧滑删除,当前可以是这样ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT
int swipeFlags = ItemTouchHelper.LEFT; // 拖动
int dragFlags = 0;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
// GridView 样式四个方向都可以
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.LEFT |
ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT;
} else {
// ListView 样式不支持左右
dragFlags = ItemTouchHelper.UP |
ItemTouchHelper.DOWN;
} return makeMovementFlags(dragFlags, swipeFlags);
} /**
* 拖动的时候不断的回调方法
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// 获取原来的位置
int fromPosition = viewHolder.getAdapterPosition();
// 得到目标的位置
int targetPosition = target.getAdapterPosition();
if (fromPosition > targetPosition) {
for (int i = fromPosition; i < targetPosition; i++) {
Collections.swap(mItems, i, i + 1);// 改变实际的数据集
}
} else {
for (int i = fromPosition; i > targetPosition; i--) {
Collections.swap(mItems, i, i - 1);// 改变实际的数据集
}
}
mAdapter.notifyItemMoved(fromPosition, targetPosition);
return true;
} /**
* 侧滑删除后会回调的方法
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 获取当前删除的位置
int position = viewHolder.getAdapterPosition();
mItems.remove(position);
// adapter 更新notify当前位置删除
mAdapter.notifyItemRemoved(position);
} /**
* 拖动选择状态改变回调
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
// ItemTouchHelper.ACTION_STATE_IDLE 看看源码解释就能理解了
// 侧滑或者拖动的时候背景设置为灰色
viewHolder.itemView.setBackgroundColor(Color.GRAY);
}
} /**
* 回到正常状态的时候回调
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// 正常默认状态下背景恢复默认
viewHolder.itemView.setBackgroundColor(0);
ViewCompat.setTranslationX(viewHolder.itemView,0);
}
});
// 这个就不多解释了,就这么attach
itemTouchHelper.attachToRecyclerView(mRecyclerView);
} protected void initData() {
for (int i = 0; i < 10; i++) {
mItems.add(new ItemBean(i * 8 + 0, "收款", R.drawable.takeout_ic_category_brand));
mItems.add(new ItemBean(i * 8 + 1, "转账", R.drawable.takeout_ic_category_flower));
mItems.add(new ItemBean(i * 8 + 2, "余额宝", R.drawable.takeout_ic_category_fruit));
mItems.add(new ItemBean(i * 8 + 3, "手机充值", R.drawable.takeout_ic_category_medicine));
mItems.add(new ItemBean(i * 8 + 4, "医疗", R.drawable.takeout_ic_category_motorcycle));
mItems.add(new ItemBean(i * 8 + 5, "彩票", R.drawable.takeout_ic_category_public));
mItems.add(new ItemBean(i * 8 + 6, "电影", R.drawable.takeout_ic_category_store));
mItems.add(new ItemBean(i * 8 + 7, "游戏", R.drawable.takeout_ic_category_sweet));
}
mItems.add(new ItemBean(mItems.size(), "更多", R.drawable.takeout_ic_more));
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.id_action_gridview:
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4));
break;
case R.id.id_action_listview:
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
break;
}
return true;
} class HomeAdapter extends CommonRecyclerAdapter<ItemBean> { public HomeAdapter(Context context, List<ItemBean> data) {
super(context, data, R.layout.item_drag_sort_delete);
} @Override
public void convert(ViewHolder holder, ItemBean item) {
holder.setText(R.id.item_text, item.text);
holder.setImageResource(R.id.item_img, item.icon);
}
} public class ItemBean {
public int id;
public String text;
public int icon; public ItemBean(int id, String text, int icon) {
this.id = id;
this.text = text;
this.icon = icon;
}
}
}

列表条目拖动排序和删除

 
 

RecyclerView-- 侧滑删除和拖动排序的更多相关文章

  1. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  2. Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper

    RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...

  3. RecyclerView实现拖动排序和滑动删除功能

    RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...

  4. RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

    RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...

  5. ItemTouchHelper(实现RecyclerView上添加拖动排序与滑动删除的所有事情)

    简单介绍: ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情.它是RecyclerView.ItemDecoration的子类 ...

  6. RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除

    现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换 ...

  7. [技术博客] 通过ItemTouchHelper实现侧滑删除功能

    通过ItemTouchHelper实现侧滑删除功能 一.效果 二.具体实现 demo中演示的这种左滑删除的效果在手机APP中比较常用,安卓也为我们提供了专门的辅助类ItemTouchHelper来帮助 ...

  8. 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)

    在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...

  9. 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...

随机推荐

  1. 基于GTK+3 开发远程控制管理软件(C语言实现)系列 一 开篇

    近期趁公司没项目来,想学习一下C和GTK+3 ,顺道再学习一下Linux下有关网络编程方面的知识. 一.学习知识: 1.C基本语法 2.GTK+3 API学习 GUI相关知识学习 3.Glade使用及 ...

  2. 监督学习——决策树理论与实践(下):回归决策树(CART)

    介绍 决策树分为分类决策树和回归决策树: 上一篇介绍了分类决策树以及Python实现分类决策树: 监督学习——决策树理论与实践(上):分类决策树          决策树是一种依托决策而建立起来的一种 ...

  3. ActiveMQ配置高可用性的方式

    当一个应用被部署于生产环境,灾备计划是非常重要的,以便从网络故障,硬件故障,软件故障或者电源故障中恢复.通过合理的配置ActiveMQ,可以解决上诉问题.最典型的配置方法是运行多个Broker,一旦某 ...

  4. ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store

    ActiveMQ新的Master/Slave存储共享机制Replicated LevelDB Store 使用ZooKeeper协调选择一个node作为master.被选择的master broker ...

  5. 读书笔记(01) - JSON - JavaScript高级程序设计

    JSON与JavaScript对象 JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似. TIPS: 与JavaScript对象的格式区别 不支持变量.函数或对象实 ...

  6. DataSet 多表关系

    protected void Page_Load(object sender, EventArgs e) { string connectionString = @"Data Source= ...

  7. UVa 514 Rails(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-514 /* 问题 输入猜测出栈顺序,如果可能输出Yes,否则输出No 解题思路 貌似没有直接可以判定的方法,紫书上给出 ...

  8. .18-浅析webpack源码之compile流程-rules参数处理(1)

    Tips:写到这里,需要对当初的规则进行修改.在必要的地方,会在webpack.config.js中设置特殊的参数来跑源码,例如本例会使用module:{rules:[...]}来测试,基本上测试参数 ...

  9. 呼叫WCF Service的方法出现Method not allowed异常

    asp.net mvc练习程序,经常性在家里电脑,笔记本或是公司的电脑之间拷贝与粘贴,如果忘记携带最新的练习程序,一些小功能只能重新写了.如前一篇<ASP.NET MVC呼叫WCF Servic ...

  10. ASP.NET MVC呼叫WCF Service的方法

    本演示,Insus.NET操练asp.net mvc的应用程序,虽然以前有写过:<MVC应用程序使用Wcf Service>http://www.cnblogs.com/insus/p/3 ...