Recyclerview单条拖拽ItemTouchHelper仿微信下拉小程序删除

news/2025/1/15 13:42:45/

主要借鉴这位博主写的博客,很详细仿微信朋友圈发表图片拖拽和删除功能_android 发布朋友圈拖动_天兰之珠的博客-CSDN博客

注意注意:自己的布局,需要滑动的Recyclerview的父布局一定要是全屏的,可以自己摸索一下就知道需要全局了

主要做了点优化

ItemTouchHelperCallback中对GridLayoutManager修改,这里需要根据用的Manager进行判断
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {//判断 recyclerView的布局管理器数据,设置 item 只能处理拖拽事件,并能够向左、右、上、下拖拽if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {//设置能拖拽的方向dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;swipeFlags = 0;//0则不响应滑动事件}return makeMovementFlags(dragFlags, swipeFlags);
}

在onMove中对加号进行判断,如果是自己本地的图片的时候是不能进行互换位置的,这里的判断可以根据自己的情况进行相关的判断,不一定按照我这个来

/*** 拖拽,交换位置(当用户从item原来的位置拖动可以拖动的item到新位置的过程中调用)** @param viewHolder 拖动的 item* @param target     目标 item*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolderviewHolder, @NonNull RecyclerView.ViewHolder target) {if (mDataList.size()<=0) {return false;}// 得到拖动ViewHolder的Positionint fromPosition = viewHolder.getAbsoluteAdapterPosition();// 得到目标ViewHolder的Positionint toPosition = target.getAbsoluteAdapterPosition();//如果是加号的时候不可以互换  这里判断可以根据自己情况判断if(TAG.equals(mDataList.get(fromPosition).getType())||TAG.equals(mDataList.get(toPosition).getType())){return false;}if (fromPosition < toPosition) {//顺序小到大for (int i = fromPosition; i < toPosition; i++) {Collections.swap(mDataList, i, i + 1);}} else {//顺序大到小for (int i = fromPosition; i > toPosition; i--) {Collections.swap(mDataList, i, i - 1);}}mAdapter.notifyItemMoved(fromPosition, toPosition);dragListener.itemMove(fromPosition, toPosition);return true;
}

onChildDraw中对控件距离底部的距离自己需要重新计算,毕竟每个需求不一定一样,所以

if (dY >= mScrollView.getHeight() - viewHolder.itemView.getBottom()-recyclerView.getY() - deleteViewHeight + mScrollView.getScrollY())这个判断条件需要根据自己的需要进行优化

我这里有两个Recyclerview都会进行删除操作,这里不仅需要viewHolder.itemView.getBottom()判断控件距离Recyclerview的顶部距离,也需要当前Recyclerview距离总布局顶部的距离,其余的都好理解了,如果删除就调用接口返回就是了

/*** 自定义拖动与滑动交互** @param c* @param recyclerView* @param viewHolder* @param dX                X轴移动的距离* @param dY                Y轴移动的距离* @param actionState       当前Item的状态* @param isCurrentlyActive 如果当前被用户操作为true,反之为false*/
@Override
public void onChildDraw(Canvas c, @NonNull RecyclerViewrecyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY,int actionState, boolean isCurrentlyActive) {if (null == dragListener) {return;}//删除区间的高度int deleteViewHeight = SizeUtils.dp2px(60);//viewHolder.itemView.getBottom()  item底部距离recyclerView顶部高度//recyclerview 距离顶部距离  recyclerView.getY()if (dY >= (mScrollView.getHeight())- viewHolder.itemView.getBottom()-recyclerView.getY()- deleteViewHeight+ mScrollView.getScrollY()) {//拖到删除处dragListener.deleteState(true);if (up) {//在删除处放手,则删除itemint absoluteAdapterPosition = viewHolder.getAbsoluteAdapterPosition();dragListener.deleteOk(absoluteAdapterPosition);initData();return;}} else {//没有到删除处dragListener.deleteState(false);}super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}

如果自己需要进行别的操作可以在

DragListener接口中定义自己需要的接口,返回就是了,这里开放性好一些

http://www.ppmy.cn/news/1033232.html

相关文章

linux系统服务学习(三)远程管理SSH服务

文章目录 远程管理SSH服务一、搭建SSH服务1、关闭防火墙与SELinux2、配置yum源3、openssh软件的安装4、查看并修改ssh服务端的配置文件5、sshd服务管理 二、SSH服务任务解决方案1、创建用户并授权第一步&#xff1a;创建用户与用户组&#xff08;html前端组&#xff0c;tom与je…

ListUtils中筛选数据方式select

ListUtils中筛选数据方式select 用法说明 /*** Selects all elements from input collection which match the given* predicate into an output list.* 从给出的集合中筛选符合对应断言的数据&#xff0c;最终汇总一个新的集合。* <p>* A <code>null</code>…

财务人员学python有意义吗,财务会python好找工作吗

这篇文章主要介绍了财务方面python需要什么水平&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 财务是一个比较特殊的工作岗位&#xff0c;每天需要接触各种各样的数据&#x…

Unity ARFoundation 配置工程 (Android)

注意&#xff1a; 1、AR Core是Google的产品&#xff0c;因为谷歌制裁华为&#xff0c;所以 有些 华为机可能不支持AR Core的软件&#xff1b; 2、手机在设置里搜索Google Play&#xff0c;看看是否已经安装上了&#xff0c;如果没有装此服务&#xff0c;去商城里搜索Google Pl…

wireshark过滤条件

当你使用Wireshark进行网络数据包分析时&#xff0c;可以使用过滤条件来筛选出你感兴趣的数据包进行观察和分析。 Wireshark支持各种过滤条件&#xff0c;可以根据协议、IP地址、端口和其他特定的网络参数进行过滤。下面是一些常用的Wireshark过滤条件及其组合使用方法的详细介…

QT学习方法

1 .类的学习方法 第一步:从UI文件中,找到界面的类—QMainWindow第二步:在Qt Creator工具中,找到“帮助”按钮,进入到帮助菜单界面,在选择"索引",在Look for:输入类名,找到类名,双击条目中的类名,在右侧会显示出来类的详细内容第三步:在右侧,可根据内容目录…

Springboot项目启动后按顺序加载自定义类 (demo)

1. 实现ApplicationRunner接口, 重写run方法 import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframewor…

什么是JavaScript中的柯里化(Currying)和偏函数应用(Partial Application)?它们在JavaScript中有哪些应用场景?

1、什么是JavaScript中的柯里化(Currying)和偏函数应用(Partial Application)&#xff1f;它们在JavaScript中有哪些应用场景&#xff1f; 柯里化&#xff08;Currying&#xff09;和偏函数应用&#xff08;Partial Application&#xff09;是函数式编程中的两个重要概念&…