-
desc : 自定义itemtouchhelper
-
revise: 参考严正杰大神博客:https://blog.csdn.net/yanzhenjie1003/article/details/51935982
*/
public class itemtouchhelpcallback extends itemtouchhelper.callback {
/**
- item操作的回调,去更新ui和数据源
*/
private onitemtouchcallbacklistener onitemtouchcallbacklistener;
/**
- 是否可以拖拽
*/
private boolean iscandrag = false;
/**
- 是否可以被滑动
*/
private boolean iscanswipe = false;
/**
- 按住拖动item的颜色
*/
private int color = 0;
public itemtouchhelpcallback(onitemtouchcallbacklistener onitemtouchcallbacklistener) {
this.onitemtouchcallbacklistener = onitemtouchcallbacklistener;
}
/**
-
设置是否可以被拖拽
-
@param candrag 是true,否false
*/
public void setdragenable(boolean candrag) {
iscandrag = candrag;
}
/**
-
设置是否可以被滑动
-
@param canswipe 是true,否false
*/
public void setswipeenable(boolean canswipe) {
iscanswipe = canswipe;
}
/**
-
设置按住拖动item的颜色
-
@param color 颜色
*/
public void setcolor(@colorint int color){
this.color = color;
}
/**
-
当item被长按的时候是否可以被拖拽
-
@return true
*/
@override
public boolean islongpressdragenabled() {
return iscandrag;
}
/**
-
item是否可以被滑动(h:左右滑动,v:上下滑动)
-
isitemviewswipeenabled()返回值是否可以拖拽排序,true可以,false不可以
-
@return true
*/
@override
public boolean isitemviewswipeenabled() {
return iscanswipe;
}
/**
-
当用户拖拽或者滑动item的时候需要我们告诉系统滑动或者拖拽的方向
-
动作标识分:dragflags和swipeflags
-
dragflags:列表滚动方向的动作标识(如竖直列表就是上和下,水平列表就是左和右)
-
wipeflags:与列表滚动方向垂直的动作标识(如竖直列表就是左和右,水平列表就是上和下)
-
思路:如果你不想上下拖动,可以将 dragflags = 0
-
如果你不想左右滑动,可以将 swipeflags = 0
-
最终的动作标识(flags)必须要用makemovementflags()方法生成
*/
@override
public int getmovementflags(@nonnull recyclerview recyclerview,
@nonnull recyclerview.viewholder viewholder) {
recyclerview.layoutmanager layoutmanager = recyclerview.getlayoutmanager();
if (layoutmanager instanceof gridlayoutmanager) {
// flag如果值是0,相当于这个功能被关闭
int dragflag = itemtouchhelper.left | itemtouchhelper.right
| itemtouchhelper.up | itemtouchhelper.down;
int swipeflag = 0;
// create make
return makemovementflags(dragflag, swipeflag);
} else if (layoutmanager instanceof linearlayoutmanager) {
linearlayoutmanager linearlayoutmanager = (linearlayoutmanager) layoutmanager;
int orientation = linearlayoutmanager.getorientation();
int dragflag = 0;
int swipeflag = 0;
// 为了方便理解,相当于分为横着的listview和竖着的listview
// 如果是横向的布局
if (orientation == linearlayoutmanager.horizontal) {
swipeflag = itemtouchhelper.up | itemtouchhelper.down;
dragflag = itemtouchhelper.left | itemtouchhelper.right;
} else if (orientation == linearlayoutmanager.vertical) {
// 如果是竖向的布局,相当于listview
dragflag = itemtouchhelper.up | itemtouchhelper.down;
swipeflag = itemtouchhelper.left | itemtouchhelper.right;
}
//第一个参数是拖拽flag,第二个是滑动的flag
return makemovementflags(dragflag, swipeflag);
}
return 0;
}
/**
-
当item被拖拽的时候被回调
-
@param recyclerview recyclerview
-
@param srcviewholder 当前被拖拽的item的viewholder
-
@param targetviewholder 当前被拖拽的item下方的另一个item的viewholder
-
@return 是否被移动
*/
@override
public boolean onmove(@nonnull recyclerview recyclerview,
@nonnull recyclerview.viewholder srcviewholder,
@nonnull recyclerview.viewholder targetviewholder) {
if (onitemtouchcallbacklistener != null) {
int srcposition = srcviewholder.getadapterposition();
int targetposition = targetviewholder.getadapterposition();
return onitemtouchcallbacklistener.onmove(srcposition, targetposition);
}
return false;
}
/**
-
当item侧滑出去时触发(竖直列表是侧滑,水平列表是竖滑)
-
@param viewholder viewholder
-
@param direction 滑动的方向
*/
@override
public void onswiped(@nonnull recyclerview.viewholder viewholder, int direction) {
if (onitemtouchcallbacklistener != null) {
onitemtouchcallbacklistener.onswiped(viewholder.getadapterposition());
}
}
/**
-
当item被拖拽或侧滑时触发
-
@param viewholder viewholder
-
@param actionstate 当前item的状态
*/
@override
public void onselectedchanged(recyclerview.viewholder viewholder, int actionstate) {
super.onselectedchanged(viewholder, actionstate);
//不管是拖拽或是侧滑,背景色都要变化
if (actionstate != itemtouchhelper.action_state_idle) {
if (color==0){
viewholder.itemview.setbackgroundcolor(viewholder.itemview.getcontext()
.getresources().getcolor(android.r.color.darker_gray));
}else {
viewholder.itemview.setbackgroundcolor(color);
}
}
}
/**
-
当item的交互动画结束时触发
-
@param recyclerview recyclerview
-
@param viewholder viewholder
*/
@override
public void clearview(@nonnull recyclerview recyclerview,
@nonnull recyclerview.viewholder viewholder) {
super.clearview(recyclerview, viewholder);
viewholder.itemview.setbackgroundcolor(viewholder.itemview.getcontext().getresources()
.getcolor(android.r.color.white));
viewholder.itemview.setalpha(1);
viewholder.itemview.setscaley(1);
}
@override
public void onchilddraw(@nonnull canvas c, @nonnull recyclerview recyclerview,
@nonnull recyclerview.viewholder viewholder,
float dx, float dy, int actionstate, boolean iscurrentlyactive) {
super.onchilddraw(c, recyclerview, viewholder, dx, dy, actionstate, iscurrentlyactive);
if (actionstate == itemtouchhelper.action_state_swipe) {
float value = 1 - math.abs(dx) / viewholder.itemview.getwidth();
viewholder.itemview.setalpha(value);
viewholder.itemview.setscaley(value);
}
}
public interface onitemtouchcallbacklistener {
/**
-
当某个item被滑动删除的时候
-
@param adapterposition item的position
*/
void onswiped(int adapterposition);
/**
-
当两个item位置互换的时候被回调
-
@param srcposition 拖拽的item的position
-
@param targetposition 目的地的item的position
-
@return 开发者处理了操作应该返回true,开发者没有处理就返回false
*/
boolean onmove(int srcposition, int targetposition);
}
}
最后
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
欢迎大家一起交流讨论啊~
《android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,,即可获取!
m srcposition 拖拽的item的position
-
@param targetposition 目的地的item的position
-
@return 开发者处理了操作应该返回true,开发者没有处理就返回false
*/
boolean onmove(int srcposition, int targetposition);
}
}
最后
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-r7ruanwn-1715839353457)]
欢迎大家一起交流讨论啊~
《android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,,即可获取!
发表评论