ItemTouchHelper类

之前我们实现了滑动列表的一些基本功能,为了实现更多的效果,我们来仔细看一下ItemTouchHelper中的类:

ItemTouchHelper.SimpleCallback

这个主要是帮你写好了getMovementFlags,你只要直接传一些参数即可,看一下怎么用:

 ItemTouchHelper mIth = new ItemTouchHelper(
new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
ItemTouchHelper.LEFT) {
public abstract boolean onMove(RecyclerView recyclerView,
ViewHolder viewHolder, ViewHolder target) {
final int fromPos = viewHolder.getAdapterPosition();
final int toPos = target.getAdapterPosition();
// move item in `fromPos` to `toPos` in adapter.
return true;// true if moved, false otherwise
}
public void onSwiped(ViewHolder viewHolder, int direction) {
// remove from adapter
}
});

ItemTouchHelper.ViewDropHandler

An interface which can be implemented by LayoutManager for better integration with ItemTouchHelper.

getItemOffsets

void getItemOffsets (Rect outRect,
View view,
RecyclerView parent,
RecyclerView.State state)
 

Retrieve any offsets for the given item. Each field of outRect specifies the number of pixels that the item view should be inset by, similar to padding or margin. The default implementation sets the bounds of outRect to 0 and returns.

If this ItemDecoration does not affect the positioning of item views, it should set all four fields of outRect (left, top, right, bottom) to zero before returning.

If you need to access Adapter for additional data, you can call getChildAdapterPosition(View) to get the adapter position of the View.

类似于itemDecoration里的getItemOffsets,也是用于给view设置padding的: outRect.set(l,t,r,b)

onDraw

void onDraw (Canvas c,
RecyclerView parent,
RecyclerView.State state)
 

Draw any appropriate decorations into the Canvas supplied to the RecyclerView. Any content drawn by this method will be drawn before the item views are drawn, and will thus appear underneath the views.

还有个onDrawOver方法,不过是用于之后的

startDrag | startSwipe

void startDrag (RecyclerView.ViewHolder viewHolder)
 

Starts dragging the provided ViewHolder. By default, ItemTouchHelper starts a drag when a View is long pressed. You can disable that behavior by overriding isLongPressDragEnabled().

For this method to work:

  • The provided ViewHolder must be a child of the RecyclerView to which this ItemTouchHelper is attached.
  • ItemTouchHelper.Callback must have dragging enabled.
  • There must be a previous touch event that was reported to the ItemTouchHelper through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener grabs previous events, this should work as expected.

For example, if you would like to let your user to be able to drag an Item by touching one of its descendants, you may implement it as follows:

     viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (MotionEvent.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
mItemTouchHelper.startDrag(viewHolder);
}
return false;
}
});

用于开始拖动的一些时间

ItemTouchHelper.Callback

canDropOver

boolean canDropOver (RecyclerView recyclerView,
RecyclerView.ViewHolder current,
RecyclerView.ViewHolder target)
 

Return true if the current ViewHolder can be dropped over the the target ViewHolder.

This method is used when selecting drop target for the dragged View. After Views are eliminated either via bounds check or via this method, resulting set of views will be passed to chooseDropTarget(ViewHolder, java.util.List, int, int).

Default implementation returns true.

用于判断某些target是否能拖过去

chooseDropTarget

RecyclerView.ViewHolder chooseDropTarget (RecyclerView.ViewHolder selected,
List<RecyclerView.ViewHolder> dropTargets,
int curX,
int curY)
 

Called by ItemTouchHelper to select a drop target from the list of ViewHolders that are under the dragged View.

Default implementation filters the View with which dragged item have changed position in the drag direction. For instance, if the view is dragged UP, it compares the view.getTop() of the two views before and after drag started. If that value is different, the target view passes the filter.

Among these Views which pass the test, the one closest to the dragged view is chosen.

This method is called on the main thread every time user moves the View. If you want to override it, make sure it does not do any expensive operations.

clearView

void clearView (RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder)
 

Called by the ItemTouchHelper when the user interaction with an element is over and it also completed its animation.

This is a good place to clear all changes on the View that was done inonSelectedChanged(RecyclerView.ViewHolder, int)onChildDraw(Canvas, RecyclerView, ViewHolder, float, float, int, boolean) or onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int, boolean).

convertToAbsoluteDirection | convertToRelativeDirection

int convertToAbsoluteDirection (int flags,
int layoutDirection)
 

Converts a given set of flags to absolution direction which means START and END are replaced with LEFT and RIGHTdepending on the layout direction.

onSelectedChanged

void onSelectedChanged (RecyclerView.ViewHolder viewHolder,
int actionState)
 

Called when the ViewHolder swiped or dragged by the ItemTouchHelper is changed.

If you override this method, you should call super.

实例

实现拖拽时改变颜色

@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { originColor=((ColorDrawable)viewHolder.itemView.getBackground()).getColor();
viewHolder.itemView.setBackgroundColor(Color.BLUE);
}
} @Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(originColor);
}

Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(2)的更多相关文章

  1. Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(1)

    场景: 近期做的TODO APP需要在主页添加一个功能,就是可以左滑删除,右滑完成.看了一下当前其他人做的例如仿探探式的效果,核心功能基本一样,但是和我预想的还是有少量区别,于是干脆自己重头学一遍如何 ...

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

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

  3. ListView列表拖拽排序

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

  4. h5页面ios,双击向上滑动,拖拽到底部还能继续拖拽(露出黑色背景)

    h5页面ios,双击向上滑动,拖拽到底部还能继续拖拽 标签: 手机 2016-02-02 18:09 696人阅读 评论(0) 收藏 举报   在ios下,双击屏幕某些地方,滚动条会自动向上走一段. ...

  5. Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作

    1. 滑动和拖拽 我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了. 1.1 swipe滑动事件 从一个坐标位置滑 ...

  6. Taro UI开发小程序实现左滑喜欢右滑不喜欢效果

    前言:年后入职了一家新公司,与前同事交接完之后,发现公司有一个四端的项目(iOS,Android,H5,小程序),iOS和安卓都实现了左滑右滑的效果,而h5和小程序端没实现,询问得知前同事因网上没找到 ...

  7. js判断手指的上滑,下滑,左滑,右滑,事件监听

    原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmove事件的时候,再获取此时手指的横坐标moveEndX和纵坐标moveEn ...

  8. Android中GridView拖拽的效果【android进化三十六】

      最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的 ...

  9. Android中GridView拖拽的效果

    最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的那么 ...

随机推荐

  1. Java中ArrayList类的用法

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  2. Access-Control-Allow-Origin设置跨域

    我来自己写一下答案,以给后来的朋友一点思路和建议:1,首先把Access-Control-Allow-Origin设置成*是不妥的,自己的接口服务器不能允许所有人都可以访问.2,具体哪里可以设置Acc ...

  3. 分享一个VueCli 3.0的项目模板

    个人搭建的Vue项目模板 默认自带  Vuex  Less 封装内容如下 vue.config axios 封装 vue 配置环境文件 vue 自定义路径映射 (cli3.0取消了默认@ 映射src的 ...

  4. Linux安装网易云音乐

    ⒈下载最新版网易云音乐安装包 http://d1.music.126.net/dmusic/netease-cloud-music_1.2.0_amd64_ubuntu_20190424_1.deb ...

  5. JustSoso笔记

    当时想了大半天,想着到底要怎么绕过MD5呢,结果还是没做出来,即使问了学长,自己还是漏了一个步骤,file=hint.php,特此笔记,又学到了个引用变量的知识 学习自 https://www.ctf ...

  6. CentOS 7.2 Ubuntu 18部署Rsync + Lsyncd服务实现文件实时同步/备份

    发送端配置: 一.配置密钥 1. 主/从服务器之间启用基于密钥的身份验证.登录发送端服务器并用 " ssh-keygen " 命令生成公共或私有的密钥. 2. 使用 " ...

  7. Pompholyx - Causes, Symptoms and Treatment

    Pompholyx is a common type of eczema. It is also known as dyshidrotic eczema or vesicular eczema of ...

  8. 如何用java实现一个p2p种子搜索(2)-路由表实现

    路由表实现 回顾一下上一篇讲的内容,上一篇提到从dht网络中获取infohash,那么加入dht网络后的最重要的第一步就是怎么去建立路由表. 路由表里面保存的是dht中其他node的信息,所以node ...

  9. CentOS 安装 Docker

    前言:其实安装步骤Docker官网很详细,如果有些人英文不好看的比较慢的话就可以直接看我的,我也是摘自官网,具体步骤如下 1. 安装依赖包 $ sudo yum install -y yum-util ...

  10. python输入一行字符,判断不同字符数量

    输入一行字符,判断不同字符的数量, 分别用for循环和while循环完成 for循环 运用了字符串方法, isupper()判断是否为大写字母 islower()判断是否为小写字母 isdigit() ...