RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢?
官方提供了ItemTouchHelper类使用过程例如以下:
- 定义ItemTouchHelper.Callback实现类,下面是几个重要的方法
package com.zms.copyapp.helper; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log; /**
* Created by Msn on 2015/7/28.
*/
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback{ private ItemTouchListener mItemTouchListener; public MyItemTouchHelperCallback(ItemTouchListener itemTouchListener){
mItemTouchListener = itemTouchListener;
} /**
* 支持长按进入拖动
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
} @Override
public boolean isItemViewSwipeEnabled() {
return false;
} /**
* 指定拖动和滑动支持的方向
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//List部分功能
// int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//拖动支持向下和向上
// int swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END;//滑动支持向左和向右
//Grid部分功能
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.START | ItemTouchHelper.END;
int swipeFlag = 0;
return makeMovementFlags(dragFlag,swipeFlag);
} @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
Log.e("Test","onMove--------------------------------");
mItemTouchListener.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
return true;
} @Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
Log.e("Test", "onSwiped--------------------------------");
mItemTouchListener.onItemDismiss(viewHolder.getAdapterPosition());
} /**
* 在每次View Holder的状态变成拖拽 (ACTION_STATE_DRAG) 或者 滑动 (ACTION_STATE_SWIPE)的时候被调用。
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if(actionState != ItemTouchHelper.ACTION_STATE_IDLE){
ItemStatusListener listener = (ItemStatusListener)viewHolder;
listener.onItemSelected();
}
super.onSelectedChanged(viewHolder, actionState);
} /**
* 在一个view被拖拽然后被放开的时候被调用,
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
ItemStatusListener listener = (ItemStatusListener)viewHolder;
listener.onItemClear();
}
}
- 声明ItemTouchHelper。并绑定到待管理的RecyclerView上
ItemTouchHelper.Callback helperCallback = new MyItemTouchHelperCallback(adapter);
helper = new ItemTouchHelper(helperCallback);
helper.attachToRecyclerView(recyclerView);
- 在Adapter中定义滑动删除和拖动排序的数据逻辑
package com.zms.copyapp; import android.graphics.Color;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView; import com.zms.copyapp.helper.ItemStatusListener;
import com.zms.copyapp.helper.ItemTouchListener; import org.w3c.dom.Text; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* Created by Msn on 2015/7/28.
*/
public class MyRecyclerListAdapter extends RecyclerView.Adapter<MyRecyclerListAdapter.MyViewHolder>
implements ItemTouchListener{
public final static String[] STR_ARRAY = {"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGTH","NINE","TEN"};
private final List<String> mItems = new ArrayList<>(); private OnDragListener dragListener; public MyRecyclerListAdapter(OnDragListener listener) {
mItems.addAll((Arrays.asList(STR_ARRAY)));
dragListener = listener;
} @Override
public void onItemMove(int fromPosition, int toPosition) {
String prev = mItems.remove(fromPosition);
mItems.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);
notifyItemMoved(fromPosition,toPosition);
} @Override
public void onItemDismiss(int position) {
mItems.remove(position);
notifyItemRemoved(position);
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_main,parent,false);
return new MyViewHolder(view);
} @Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.textView.setText(mItems.get(position));
holder.handleImgv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(MotionEventCompat.getActionMasked(motionEvent)
== MotionEvent.ACTION_DOWN){
dragListener.onStartDrag(holder);
Log.e("Test","onTouch.ACTION_DOWN");
}
return false;
}
});
} @Override
public int getItemCount() {
return mItems.size();
} public class MyViewHolder extends RecyclerView.ViewHolder implements ItemStatusListener{
public ImageView handleImgv;
public TextView textView;
public MyViewHolder(View view){
super(view);
textView = (TextView)view.findViewById(R.id.text);
handleImgv = (ImageView)view.findViewById(R.id.handle);
} @Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
} @Override
public void onItemClear() {
itemView.setBackgroundColor(Color.TRANSPARENT);
}
} public interface OnDragListener{
public void onStartDrag(MyViewHolder holder);
public void onStartSwipe(MyViewHolder holder);
}
}
这样一个拖动重排的功能就实现了:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能的更多相关文章
- Android学习之ItemTouchHelper实现RecylerView的拖拽以及滑动删除功能
今天在群里见大神们提到控件的拖动以及滑动删除的效果实现,就在网上找了资料ItemTouchHelper学习,并实现其功能.不胜窃喜之至,忍不住跟大家分享一下,如今就对学习过程做下简介.帮助大家实现这样 ...
- IOS第七天(6:UiTableView编辑模式, 拖动位置 ,滑动删除)
**********UiTableView编辑模式, 拖动位置 ,滑动删除 #import "HMViewController.h" @interface HMViewContro ...
- 自定义listView添加滑动删除功能
今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...
- RecyclerView实现拖动排序和滑动删除功能
RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...
- Android滑动删除功能
今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. ...
- android 继承ListView实现滑动删除功能.
在一些用户体验较好的应用上,可以经常遇见 在ListView中 向左或向右滑动便可删除那一项列表. 具体实现 则是继承ListView实现特定功能即可. (1). 新建 delete_butt ...
- 如何在RecyclerView上面实现"拖放"和"滑动删除"-1
Android上面有许多的教程, 库和示例, 在RecyclerView上面实现"拖放"和"滑动删除"功能. 尽管有更新, 更好的方法可用, 但是大多数人依然使 ...
- 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能
大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...
- ItemTouchHelper(实现RecyclerView上添加拖动排序与滑动删除的所有事情)
简单介绍: ItemTouchHelper是一个强大的工具,它处理好了关于在RecyclerView上添加拖动排序与滑动删除的所有事情.它是RecyclerView.ItemDecoration的子类 ...
随机推荐
- vue自定义一个过滤器
vue如何自定义一个过滤器 html代码: <div id="app"> <input type="text" v-model="m ...
- Springboot2本地锁实践
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交…. 下面我们利用 ...
- angular-Then的用法
then怎么使用(主要是如何从中提取出我们需要的后台返回的数据):then(fn) 方法中带一个参数,这个参数就是要被执行的函数,并且,这个作为参数的函数本身有一个参数,这个参数就是我们需要的数据,这 ...
- Android Touch事件传递机制全面解析(从WMS到View树)
转眼间近一年没更新博客了,工作一忙起来.非常难有时间来写博客了,因为如今也在从事Android开发相关的工作,因此以后的博文也会很多其它地专注于这一块. 这篇文章准备从源代码层面为大家带来Touch事 ...
- 匿名訪问之(一)web application级别
假设用SharePoint做一个对外开放的公共站点,比方公司展示站点.那么浏览站点的人不须要注冊和登陆.就应该能看到内容.这个时候就须要对站点开启匿名訪问. SharePoint的匿名訪问是从上而下的 ...
- video_capture模块分析
1. 对外接口 VideoCaptureModule 控制接口 VideoCaptureDataCallback Vie中的ViECapturer继承,用于响应抓包数据 2 ...
- hdu2546 饭卡 01-背包问题
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem ...
- JAVA设计模式之【代理模式】
代理模式 通过代理对象间接访问 代购 客户端不想或者不能直接访问一个对象,可以通过一个称为代理的第三者来实现间接访问,该方案称为代理模式 角色 抽象主题角色Subject 声明真实主题类与代理类的公共 ...
- nyoj--325--zb的生日(简单dp)
zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝 ...
- Sobel算子及C++实现
Sobel 算子是一个离散的一阶微分算子,用来计算图像灰度函数的近似梯度. 在空间域上Sobel算子很容易实现,执行速度快,对部分噪声具有平滑作用,还能够提供较为精确的边缘方向信息,缺点是边缘定位精度 ...