RecyclerView-- 侧滑删除和拖动排序
实现这么个功能我们不需要再去继承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-- 侧滑删除和拖动排序的更多相关文章
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...
- RecyclerView实现拖动排序和滑动删除功能
RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...
- RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...
- ItemTouchHelper(实现RecyclerView上添加拖动排序与滑动删除的所有事情)
简单介绍: ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情.它是RecyclerView.ItemDecoration的子类 ...
- RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除
现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换 ...
- [技术博客] 通过ItemTouchHelper实现侧滑删除功能
通过ItemTouchHelper实现侧滑删除功能 一.效果 二.具体实现 demo中演示的这种左滑删除的效果在手机APP中比较常用,安卓也为我们提供了专门的辅助类ItemTouchHelper来帮助 ...
- 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)
在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...
- 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。
重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...
随机推荐
- (转)【深度长文】循序渐进解读Oracle AWR性能分析报告
原文:https://dbaplus.cn/news-10-734-1.html https://blog.csdn.net/defonds/article/details/52958303 作者介绍 ...
- charles重复发包工具/repeat
重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如果您进行后端更改并希望测试它们,用了 ...
- ThreadPoolExecutor策略配置以及应用场景
ThreadPoolExecutor 是用来处理异步任务的一个接口,可以将其理解成为一个线程池和一个任务队列,提交到 ExecutorService 对象的任务会被放入任务队或者直接被线程池中的线程执 ...
- mysql pdo设置显示报错
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- 【区块链Go语言实现】Part 1:区块链基本原型
0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力尚未被完全意识到.从本质上讲,区块链只是一种记录的分布式数据库.但它之所以独特,是因 ...
- Java 8 新特性-菜鸟教程 (1) -Java 8 Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中). 使用 Lambda 表达式可以使代码变的更加 ...
- Java创建线程的两种方式
方式 继承Thread类 实现Runnable方法 实例 #继承Thread类 public class ThreadTest2 extends Thread { private int thread ...
- SpringBoot学习(二)——Spring的Java配置方式
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 一.@Configuration 和 @Bean Spring的Java配置方式是通过@Configuration和@Bean ...
- angular $q promise详解
前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...
- Spring-mvc登录方法及JSP的拦截
添加登录拦截器:LoginInterceptor import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Htt ...