当前位置:网站首页>RecyclerView高级使用(二)-垂直拖拽排序的简单实现
RecyclerView高级使用(二)-垂直拖拽排序的简单实现
2022-04-23 14:06:00 【森之千手】
先看看要实现的效果图:
-侧滑删除的简单实现和RecyclerView细节研究-RecyclerView点击错位问题的探讨与修复。这里我们需要自己手写一个类VerticalDragSortHelperCallBack去继承ItemTouchHelper.Callback,我们需要实现下面的方法:
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlag, ItemTouchHelper.ACTION_STATE_IDLE);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
int fromPos = viewHolder.getAdapterPosition();
int toPos = target.getAdapterPosition();
Log.d("onMove", fromPos + "--->" + toPos);
//1、从数据源上交换条目的位置
Collections.swap(recyclerItemList, fromPos, toPos);
//2、从视图上通知刷新视图的改变
recyclerView.getAdapter().notifyItemMoved(fromPos, toPos);
//3、更正实际点击的position,防止点击时,position错乱
int startPos = Math.min(fromPos, toPos);
int itemCount = Math.abs(fromPos - toPos) + 1;
recyclerView.getAdapter().notifyItemRangeChanged(startPos, itemCount);
//4、PS:2和3的合体步骤可以用4替代,但是就没有了替换动画了,而且刷新效率比上面低,是全局刷新
// recyclerView.getAdapter().notifyDataSetChanged();
//请注意该返回值:只有在返回true的时候,才会走onMoved方法
return true;
}
@Override
public void onMoved(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, int fromPos, @NonNull RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
Log.d("onMoved", "第一个:" + recyclerItemList.get(0).toString() + " " + fromPos + "--->" + toPos);
Log.d("onMoved", "第二个:" + recyclerItemList.get(1).toString() + " " + fromPos + "--->" + toPos);
if (onDragListener != null) {
onDragListener.onItemMoved(viewHolder, target, fromPos, toPos);
}
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
需要注意的是:
1、因为垂直方向拖拽,所以getMovemonetFlags返回的是DOWN和UP
2、在onMove中,pos由于是从零开始计算的,所以实际的刷新条目个数要+1
3、在onMove中,关于数据的交换,采用了系统Collections的swap交换,更为高效
4、isLongPressDragEnabled表示是否是长按后才启用拖拽,这里需要返回true,表示需要
源码下载地址:github
版权声明
本文为[森之千手]所创,转载请带上原文链接,感谢
https://blog.csdn.net/cjs1534717040/article/details/115300429
边栏推荐
- Wechat applet obtains login user information, openid and access_ token
- 查询2013年到2021年的数据,只查询到2020的数据,遇到了这个问题所进行的解决办法
- 全局变量能否放在头文件中定义
- Chrome插件 之 Selenium IDE、XPath 安装
- 室内外地图切换(室内基于ibeacons三点定位)
- 修改ddt生成的测试用例名称
- Call wechat customer service applet
- Prediction of tomorrow's trading limit of Low Frequency Quantization
- findstr不是内部或外部命令解决方法
- Intégration de Clusters CDH Phoenix basée sur la gestion cm
猜你喜欢
Promtail + Loki + Grafana 日志监控系统搭建
JDBC入门
01-NIO基础之ByteBuffer和FileChannel
Ptorch classical convolutional neural network lenet
linux安装mysql后修改密码
Jmeter设置环境变量支持在任意终端目录输入jmeter直接启动
Detailed tutorial on the use of smoke sensor (mq-2) (based on raspberry pie 3B +)
Chapter I review of e-commerce spike products
帆软报表设置单元格填报以及根据值的大小进行排名方法
Detailed tutorial on the use of setinterval timing function of wechat applet
随机推荐
网站_收藏
基于微信小程序的wifi模块使用
微信小程序调用客服接口
帆软中单元格中隔行变色以及数量大于100字体变大变红设置
封装logging模块
烟雾传感器(mq-2)使用详细教程(基于树莓派3b+实现)
VMWare安装64位XP中文教程
DeepinV20安装Mariadb
在MAC上安装mysql
Lin Lin, product manager of Lenovo: network failure of local network operator in Tianjin. The background server of Zui system can't work normally for the time being
基于CM管理的CDH6.3.2集群集成Atlas2.1.0
微信小程序获取登录用户信息、openid和access_token
findstr不是内部或外部命令解决方法
分库分表 & ShardingSphere
Chapter I review of e-commerce spike products
sql中出现一个变态问题
微信小程序进行蓝牙初始化、搜索附近蓝牙设备及连接指定蓝牙(一)
Intégration de Clusters CDH Phoenix basée sur la gestion cm
Ptorch classical convolutional neural network lenet
如何快速批量创建文本文档?