神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇
神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇
- 一、目标
- 二、体验地址
- 三、技术问题
- 1. 拖拽排序问题
- 2. indexOf问题
- 四、Finally
一、目标
记录开发过程中的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.8.0——删除笔记/文件夹·代码篇
神马笔记 版本1.8.0--删除笔记/文件夹·代码篇 一.目标 二.体验地址 三.功能设计 1. 实现删除功能 2. 处理最近删除的可见性 四.实现过程 1. 删除到最近删除 2. 从最近删除恢复 3 ...
- 神马笔记 版本2.8.0——视频笔记
神马笔记 版本2.8.0--视频笔记 一.目标 二.下载地址 三.功能介绍 1. 录制新的视频 2. 选择已有视频 3. 笔记内播放视频 4. 全屏播放视频 5. 全屏查看图片 6. 隐藏的功能 四. ...
- 神马笔记 版本2.4.0——对话笔记
神马笔记 版本2.4.0--对话笔记 一.目标 二.体验地址 三.功能介绍 1. 创建对话笔记 2. 编辑对话笔记 3. 自动保存草稿 四.对话笔记 VS 文章笔记 五.开发过程回顾 六.下一版本开发 ...
- 神马笔记 版本2.7.0——语音笔记
神马笔记 版本2.7.0--语音笔记 一.目标 二.下载地址 三.功能介绍 1. 授予录音权限 2. 启动语音笔记 3. 记录语音笔记 4. 播放语音笔记 5. 切换扬声器 四.开发过程回顾 五.下一 ...
- 神马笔记 版本2.9.0——音乐笔记
神马笔记 版本2.9.0--音乐笔记 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.笔记元素一览 六.下一版本开发计划 七.新版本规划 八.历史版本回顾 九.帮助和反馈 十.Finall ...
- 神马笔记 版本2.11.0——歌词笔记
神马笔记 版本2.11.0--歌词笔记 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.遇到的问题 六.Finally 终于实现歌词笔记的第一版本了. 支持从网易云音乐和酷狗音乐导入歌词文 ...
- 神马笔记 版本1.7.0——辅助编辑
神马笔记 版本1.7.0--辅助编辑 一.目标 二.体验地址 三.功能介绍 1. 大纲结构 2. 拖拽排序 3. 左滑删除 4. 段落缩进 5. 进入辅助编辑 四.下一版本预告 五.历史版本回顾 六. ...
- 神马笔记 版本2.10.0——图片查看器
神马笔记 版本2.10.0--图片查看器 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.笔记元素一览 六.下一版本开发计划 七.新版本规划 八.历史版本回顾 九.帮助和反馈 十.Fina ...
- 神马笔记 版本1.4.0
神马笔记 版本1.4.0 一.新版本介绍 二.下载地址 三.下一版本功能预告 四.已经完成的功能 五.计划中的功能 六.意见反馈 1. 微信 2. 聊天宝 一.新版本介绍 新增undo/redo功能 ...
最新文章
- 开源(Open Source)那些事儿 (一)
- codevs1245 最小的N个和
- 云栖科技评论NO.2 | 张学友演唱会逃犯集中落网,真正的“神捕”其实是AI
- 十年硬件老司机,结合实际案例,带你探索单片机低功耗设计!
- 缓存系统MemCached的Java客户端优化历程
- iOS UItextView监听输入特定字符跳转页面选择选项返回
- css hover变成手_web前端入门到实战:彻底掌握css动画「transition」
- Mybatis(18)注解实现表名和类属性名不匹配问题
- 豆瓣镜像源的使用与pip包版本控制
- 记事本代码在命令行运行时出现的中文乱码问题
- VC++界面美化---模仿MS Office 选项对话框
- 【Netty-进阶】学习笔记
- unity 生成和识别二维码
- 环形电流计算公式_环形电流的磁场分布 怎么计算
- Linux搭建部署Ldap服务器,亲测可用
- ioi2016aliens
- 关于IFRame的使用
- Server服务器修改时间,如何在 Windows Server 中配置权威时间服务器
- 微信小程序将unicode格式内容转为中文
- MySQL基础-传智黑马网课笔记
热门文章
- 111完美邮箱品牌域名——数字域名111.com
- slite 存储图片
- 安卓11客制需求:<MtkSettings:添加桌面设置,并且能够正常切换桌面APK>
- 双非硕士211,阿里(蚂蚁)技术四面:技术一面+技术二面+主管三面+HR面
- 10的负8次方用python_matplotlib;10的分数次幂;科学记数法
- Android 隐藏 返回键 Home键 隐藏最下面的NAVIGATION栏
- 计算机基础知识文件的复制移动,如何复制文件
- word2vec总结
- 如何编辑小红书种草文案?小红书怎么编写种草文案?
- 阿里安全专家BlackHat和DEFCON现场演示:一分钟越狱iOS 11.4