神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇

  • 一、目标
  • 二、体验地址
  • 三、技术问题
    • 1. 拖拽排序问题
    • 2. indexOf问题
  • 四、Finally

一、目标

记录开发过程中的2个技术问题。

  1. 拖拽排序问题
  2. indexOf问题

二、体验地址

神马笔记最新版本下载:【神马笔记 版本1.8.0——删除笔记/文件夹功能.apk

三、技术问题

1. 拖拽排序问题

ItemTouchHelper.Callback#onMove()方法应该怎么实现?

public abstract boolean onMove(@NonNull RecyclerView recyclerView,@NonNull ViewHolder viewHolder, @NonNull ViewHolder target);
  • 实现一
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {//滑动事件  下面注释的代码,滑动后数据和条目错乱,被舍弃// Collections.swap(datas,viewHolder.getAdapterPosition(),target.getAdapterPosition());// ap.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());//得到当拖拽的viewHolder的Positionint fromPosition = viewHolder.getAdapterPosition();//拿到当前拖拽到的item的viewHolderint toPosition = target.getAdapterPosition();if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(datas, i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(datas, i, i - 1);}}ap.notifyItemMoved(fromPosition, toPosition);return true;
}

代码来自:《RecyclerView拖拽排序》。

  • 实现二
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {//直接按照文档来操作啊,这文档写得太给力了,简直完美!adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());//注意这里有个坑的,itemView 都移动了,对应的数据也要移动Collections.swap(list, viewHolder.getAdapterPosition(), target.getAdapterPosition());return true;
}

代码来自:《RecyclerView的item拖动排序效果实现和它的ItemTouchHelper详解》。

  • 实现三
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {int from = viewHolder.getAdapterPosition();int to = target.getAdapterPosition();list.add(to, list.remove(from));adapter.notifyItemMoved(from, to);
}

代码来自:神马笔记

  • 方案结果
结果 备注
方案一 正确
方案二 错误 快速拖动进行排序时,必然会导致顺序混乱。
方案三 正确

方案一和方案三是正确的。

方案二在逐个依次拖拽排序,不会出现问题。当快速拖动,超过2个列表项时,则会发生顺序混乱。

原因何在?

onMove方法指的是viewHolder移动到target的位置,而不是二者交换。

例如:初始列表:

A B C D E F G

将A移动到E的位置,结果是:

B C D E A F G

而A与E交换位置,结果是:

E B C D A F G

onMove方法要求的是移动操作,而Collections#swap实现的是交换操作,因此必然导致顺序发生换乱。

2. indexOf问题

ArrayList#indexOf()的实现代码

public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;
}

Object#equals()的实现代码

public boolean equals(Object obj) {return (this == obj);
}

indexOf检索非null对象时,是通过调用equals方法进行比较,默认的实现方式则是判断引用是否相等。

也就是说,在没有重载equals方式时,默认的检索行为是判断引用是否相等。

重载equals方法后,则是根据equals具体实现进行检索。

因此,当重载equals方式时,需要注意的是这也将影响到列表的检索行为。

四、Finally

~独立小桥风满袖~平林新月人归后~

神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇相关推荐

  1. 神马笔记 版本1.8.0——删除笔记/文件夹·代码篇

    神马笔记 版本1.8.0--删除笔记/文件夹·代码篇 一.目标 二.体验地址 三.功能设计 1. 实现删除功能 2. 处理最近删除的可见性 四.实现过程 1. 删除到最近删除 2. 从最近删除恢复 3 ...

  2. 神马笔记 版本2.8.0——视频笔记

    神马笔记 版本2.8.0--视频笔记 一.目标 二.下载地址 三.功能介绍 1. 录制新的视频 2. 选择已有视频 3. 笔记内播放视频 4. 全屏播放视频 5. 全屏查看图片 6. 隐藏的功能 四. ...

  3. 神马笔记 版本2.4.0——对话笔记

    神马笔记 版本2.4.0--对话笔记 一.目标 二.体验地址 三.功能介绍 1. 创建对话笔记 2. 编辑对话笔记 3. 自动保存草稿 四.对话笔记 VS 文章笔记 五.开发过程回顾 六.下一版本开发 ...

  4. 神马笔记 版本2.7.0——语音笔记

    神马笔记 版本2.7.0--语音笔记 一.目标 二.下载地址 三.功能介绍 1. 授予录音权限 2. 启动语音笔记 3. 记录语音笔记 4. 播放语音笔记 5. 切换扬声器 四.开发过程回顾 五.下一 ...

  5. 神马笔记 版本2.9.0——音乐笔记

    神马笔记 版本2.9.0--音乐笔记 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.笔记元素一览 六.下一版本开发计划 七.新版本规划 八.历史版本回顾 九.帮助和反馈 十.Finall ...

  6. 神马笔记 版本2.11.0——歌词笔记

    神马笔记 版本2.11.0--歌词笔记 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.遇到的问题 六.Finally 终于实现歌词笔记的第一版本了. 支持从网易云音乐和酷狗音乐导入歌词文 ...

  7. 神马笔记 版本1.7.0——辅助编辑

    神马笔记 版本1.7.0--辅助编辑 一.目标 二.体验地址 三.功能介绍 1. 大纲结构 2. 拖拽排序 3. 左滑删除 4. 段落缩进 5. 进入辅助编辑 四.下一版本预告 五.历史版本回顾 六. ...

  8. 神马笔记 版本2.10.0——图片查看器

    神马笔记 版本2.10.0--图片查看器 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.笔记元素一览 六.下一版本开发计划 七.新版本规划 八.历史版本回顾 九.帮助和反馈 十.Fina ...

  9. 神马笔记 版本1.4.0

    神马笔记 版本1.4.0 一.新版本介绍 二.下载地址 三.下一版本功能预告 四.已经完成的功能 五.计划中的功能 六.意见反馈 1. 微信 2. 聊天宝 一.新版本介绍 新增undo/redo功能 ...

最新文章

  1. 开源(Open Source)那些事儿 (一)
  2. codevs1245 最小的N个和
  3. 云栖科技评论NO.2 | 张学友演唱会逃犯集中落网,真正的“神捕”其实是AI
  4. 十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!
  5. 缓存系统MemCached的Java客户端优化历程
  6. iOS UItextView监听输入特定字符跳转页面选择选项返回
  7. css hover变成手_web前端入门到实战:彻底掌握css动画「transition」
  8. Mybatis(18)注解实现表名和类属性名不匹配问题
  9. 豆瓣镜像源的使用与pip包版本控制
  10. 记事本代码在命令行运行时出现的中文乱码问题
  11. VC++界面美化---模仿MS Office 选项对话框
  12. 【Netty-进阶】学习笔记
  13. unity 生成和识别二维码
  14. 环形电流计算公式_环形电流的磁场分布 怎么计算
  15. Linux搭建部署Ldap服务器,亲测可用
  16. ioi2016aliens
  17. 关于IFRame的使用
  18. Server服务器修改时间,如何在 Windows Server 中配置权威时间服务器
  19. 微信小程序将unicode格式内容转为中文
  20. MySQL基础-传智黑马网课笔记

热门文章

  1. 111完美邮箱品牌域名——数字域名111.com
  2. slite 存储图片
  3. 安卓11客制需求:<MtkSettings:添加桌面设置,并且能够正常切换桌面APK>
  4. 双非硕士211,阿里(蚂蚁)技术四面:技术一面+技术二面+主管三面+HR面
  5. 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
  6. Android 隐藏 返回键 Home键 隐藏最下面的NAVIGATION栏
  7. 计算机基础知识文件的复制移动,如何复制文件
  8. word2vec总结
  9. 如何编辑小红书种草文案?小红书怎么编写种草文案?
  10. 阿里安全专家BlackHat和DEFCON现场演示:一分钟越狱iOS 11.4