之前在做一个App自定义顺序的功能,用户需要拖动App到自己想要的位置,刚开始一切都写好之后,拖动么有问题当排序之后发现位置完全错乱了,根本不是我们想要的顺序,所以今天就把这个坑分享出来,也给自己做个记录。

定义接口记录拖动前后的位置:

public interface ItemTouchHelperAdapter {//数据交换前后位置void onItemMove(int fromPosition, int toPosition);}

实现接口:

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {private ItemTouchHelperAdapter mAdapter;private boolean sort = false;public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {mAdapter = adapter;}/** 用于返回可以滑动的方向* */@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT                | ItemTouchHelper.LEFT;        //允许上下左右的拖动int swipeFlags = 0;   //不允许侧滑return makeMovementFlags(dragFlags, swipeFlags);}/** 当用户拖动一个Item进行上下移动从旧的位置到新的位置的时候会调用该方法* */@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());return true;}/** 当用户左右滑动Item达到删除条件时,会调用该方法* */@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}//设置item是否可以拖动public void setSort(boolean sort) {this.sort = sort;}/** 该方法返回true时,表示支持长按拖动,即长按ItemView后才可以拖动  默认返回true* */@Overridepublic boolean isLongPressDragEnabled() {return sort;}/** 该方法返回true时,表示如果用户触摸并左右滑动了View,* 那么可以执行滑动删除操作,即可以调用到onSwiped()方法。默认是返回true* */@Overridepublic boolean isItemViewSwipeEnabled() {return false;}}

RecyclerView的adapter  实现 ItemTouchHelperAdapter 接口  重写onItemMove方法:

重要的代码来了,是他,是他,就是他,看下面

@Overridepublic void onItemMove(int fromPosition, int toPosition) {if (fromPosition < toPosition) {//从上往下拖动,每滑动一个item,都将list中的item向下交换,向上滑同理。for (int i = fromPosition; i < toPosition; i++) {Collections.swap(mList, i, i + 1);//交换数据源两个数据的位置}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(mList, i, i - 1);//交换数据源两个数据的位置}}//更新视图notifyItemMoved(fromPosition, toPosition);}

判断拖动前后position的大小,交换位置这样就保证在拖动前后位置不错乱了

因为重写的 ItemTouchHelper.Callback 中的 onMove方法是在拖动的时候实时触发的  所以我们自定义的onItemMove方法也是实时调用的,所以item的position也是实时交换的

最后一步 就是在我们的activity中 设置就ok了

        recyclerAdapter = new AppSortRecyclerAdapter(list,this);recycler.setAdapter(recyclerAdapter);//先实例化Callbackcallback = new SimpleItemTouchHelperCallback(recyclerAdapter);//用Callback构造ItemtouchHelpertouchHelper = new ItemTouchHelper(callback);//调用ItemTouchHelper的attachToRecyclerView方法建立联系touchHelper.attachToRecyclerView(recycler);

对对对  就这样设置一下,就ok了  拖动之后你可以重新遍历一遍看看是不是position也变化了,反正我的是变化了,希望可以帮助到刚接触这块的大佬们

大佬们再见,下次有坑再来分享给大家!!!

RecyclerView拖动及拖动后position错乱问题相关推荐

  1. 安卓P 自动调节亮度打开的状态下,手动拖动亮度条后,自动调节亮度失效

    客户反馈:自动调节亮度打开的状态下,手动拖动亮度条后,自动调节亮度失效 分析:这个是正常现象,用户手动调节后,不再自动调节亮度:但是客户不要这个效果,要求自动调节亮度一直生效. 关于自动调节亮度流程主 ...

  2. krpano场景拖动时拖动惯性消失的问题

    问题背景:在写一个基于krpano的全景项目时突然发现场景拖动时拖动惯性消失了.查看官方文档,检查和控制相关的control标签的参数没有问题,并且也一直没有修改过. 排查过程:推测为某插件调用了相关 ...

  3. 解决:RecyclerView 滑动后布局错乱

    一.问题说明 我的需求是要做一个类似这样的列表,整体是一个 RecyclerView,每个 item 内部会有一个流式布局,在流式布局内部会动态添加 TextView,TextView 的大小是自适应 ...

  4. 悬浮View,可拖动,放手后自动吸附到屏幕边上。

    悬浮View,应用内悬浮 本章给大家介绍自定义悬浮View,可随手指拖动,手指放开后会自动吸附到手机屏边缘,悬浮View内的Content布局可以任意放入自定义的布局,非常方便. 效果图: 核心部分是 ...

  5. 解决微信小程序使用css滤镜filter后position fixed错乱

    最近给wechat小程序设置灰色页面,给page标签使用灰色滤镜后导致position fixed位置错乱,无法正确定位,样式错乱 解决方案: 不对page view标签设置滤镜filter,只对 t ...

  6. android RecyclerView 添加可拖动的滚动条

    实现的效果图如下,为了效果这里我设置的宽了一些,实际根据需求修改即可 先说几个属性: android:scrollbars" 一般都是垂直的滚动条设置vertical android:scr ...

  7. android点赞刷新列表图片闪烁,RecyclerView使用——有效解决刷新数据错乱,图片闪烁,OOM问题...

    做项目时,用到RecyclerView去加载1w张图片,为了防止OOM,需要进行分页预加载;这些完成后测试发现刷新recyclerView会造成数据错乱,在查阅资料得到一下的解决方法. 根据网上资料: ...

  8. html5 table的表头拖动,可拖动table表头的实现

    前言 自己做的项目碰到这样一个需求,就是对所有的表格添加表头可以拖动的效果.我一想,这不简单,分分钟钟给你做出来.拿起我的电脑,啪啪啪就敲起来了. 一定是哪里不对,以我的聪明才智,结果应该不是这样的, ...

  9. Android UI控件之Gallery(拖动效果) --拖动式图片浏览

    我们知道现在智能手机上都有这样一种功能,就是你在浏览图片的时候.不是硬性的点击按钮 而是可以实现手指的拖动,划开效果.使用户具有更好的交互体验,不过这种效果是如何实现的呢? 在Android中是通过G ...

最新文章

  1. 安卓MP3播放器开发实例(1)之音乐列表界面
  2. 使用 BOOST_PROTO_DEFINE_OPERATORS 使用非原型类型 std::vector<> 对表达式进行原型化的示例
  3. WebAPI(part2)--获取元素
  4. android studio初始化设置,Android studio 初始设置
  5. COS系统的前端演变和发展
  6. android 天气接口简书,天气API接口说明
  7. mysql sql%rowcount_sql%rowcount 返回影响行数
  8. 使用FileUpload上传图片到数据库
  9. 那些相见恨晚的 JavaScript 技巧
  10. T(n) = 25T(n/5)+n^2的时间复杂度?
  11. 笔记本计算机故障排除,笔记本电脑常见故障原因 笔记本电脑常见故障解决方法【详解】...
  12. Linux文件其他操作
  13. 小学一年级20以内加减法题目自动生成(家长的福利,孩子的魔鬼)
  14. 光通信的再思考:5G流量爆发下的数据密度革命
  15. python人工智能之:多边形矩阵热图程序实战篇(二)
  16. 如何找到算法的时间复杂度
  17. 容量 Byte、KB、MB、GB、TB、PB、EB、ZB、YB、NB、DB、CB、XB
  18. Python解析json文件
  19. C++内存管理机制—Primitives笔记
  20. 【腾讯广告】监测链接和API自归因回传接口逻辑

热门文章

  1. MFC中LoadLibrary调用Qt动态库失败的原因
  2. 解决chrome下用google搜索图片第二页以后不显示的问题
  3. html老师点名软件的代码,随机点名器点击按钮文字随机点名器代码
  4. Iphone CPU 架构类型
  5. 十大悖论——你以为你以为的就是你以为的了吗
  6. 蔚来汽车出售其电动方程式赛车车队 但仍提供赞助
  7. 【java表达式引擎】一、汇总目前开源的公式计算开源库
  8. 种绿色稻养黄沙鳖 国稻种芯·中国水稻节:广西玉林稻田新门道
  9. Spring Cloud Alibaba(2)---RestTemplate微服务项目
  10. 轻松玩转Flutter混合开发