当前位置:网站首页>RecyclerView 实现拖拽、滑动删除
RecyclerView 实现拖拽、滑动删除
2022-08-08 14:06:00 【左丘梦凡】
借助ItemTouchHelper即可实现如下效果图的拖拽
- 继承ItemTouchHelper.Callback
class RvTouchHelperCall(val adapter: RvAdapter) : ItemTouchHelper.Callback() {
/**
* 返回滑动,拖拽方向
* @param recyclerView
* @param viewHolder 需要移动信息的viewHelper
* @return
*/
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
val manager = recyclerView.layoutManager
var dragFlags = 0
var swipeFlags = 0
when(manager){
//可上下左右拖拽
is GridLayoutManager ->{
//拖拽方向
dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END
}
//可上下左右拖拽
is StaggeredGridLayoutManager -> {
//拖拽方向
dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END
}
//可上下拖拽,左右滑动移除item
is LinearLayoutManager -> {
//拖拽方向
dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
//滑动方向,不需要滑动移除item的swipeFlags设置为0
swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
}
}
return makeMovementFlags(dragFlags,swipeFlags)
}
/**
* 拖拽时回调的方法
* @param recyclerView
* @param viewHolder 正在拖动的viewHelper
* @param target 拖拽方向下个item的viewHelper
* @return
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
//起始位置
val startPosition = viewHolder.adapterPosition
//结束位置
val endPosition = target.adapterPosition
adapter.moveItem(startPosition,endPosition)
return true
}
/**
* 滑动时回调的方法
* @param viewHolder
* @param direction RecyclerView的状态
* ItemTouchHelper.ACTION_STATE_IDLE 空闲状态
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
adapter.deleteItem(viewHolder.adapterPosition)
}
/**
* 当ItemTouchHelper 滑动、拖拽的ViewHelper发生更改时调用,在此添加动画等
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
//按下时放大
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE){
viewHolder?.let {
val animate = ViewCompat.animate(it.itemView)
animate.duration = 200
animate.scaleX(1.2f).scaleY(1.2f).start()
}
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 拖拽或滑动结束时回调,在此结束动画
* @param recyclerView
* @param viewHolder 用户交互的viewHelper
*/
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
val animate = ViewCompat.animate(viewHolder.itemView)
animate.duration = 200
animate.scaleX(1f).scaleY(1f).start()
super.clearView(recyclerView, viewHolder);
}
}
2.在Adapter中实现moveItem(),deleteItem()
class RvAdapter(private val items: ArrayList<String>) : RecyclerView.Adapter<RvHolder>() {
... ...
fun itemMove(startPosition: Int, endPosition: Int) {
//拖拽时,调整adapter数据的顺序
Collections.swap(items,startPosition,endPosition)
notifyItemMoved(startPosition,endPosition)
}
fun itemDelete(adapterPosition: Int) {
//移除数据
items.removeAt(adapterPosition)
notifyItemRemoved(adapterPosition)
}
}
3.ItemTouchHelper于RecyclerView 关联起来
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val items = arrayListOf<String>()
for (index in 0..40){
items.add("item index = $index")
}
val adapter = RvAdapter(items)
val rv = findViewById<RecyclerView>(R.id.rlv)
val itemDecoration = RvItemDecoration()
rv.layoutManager = GridLayoutManager(this,2)
rv.adapter = adapter
if (rv.itemDecorationCount <= 0){
rv.addItemDecoration(itemDecoration)
}
val callback = RvTouchHelperCall(adapter)
val helper = ItemTouchHelper(callback)
helper.attachToRecyclerView(rv)
}
}
边栏推荐
- MySQL:索引(1)原理与底层结构
- 【小码匠自习室】ABC179-C:代码竟然没排倒数堪称一大奇迹
- Flink1.15 组件RPC通信过程概览图
- 教学习编程,第一步解决自信问题,培养自己的专注力
- 我凭借这份pdf成功拿到了阿里,腾讯,京东等六家大厂offer
- shell三剑客-----awk命令
- shell正则表达式,三剑客grep命令
- Harvard University smashes the field: DALL-E 2 is just a "glue monster", and the generation accuracy rate is only 22%
- 【Rust—LeetCode题解】1408.数组中的字符串匹配
- 复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
猜你喜欢
活动报名| StreamNative 受邀参与 ITPUB 在线技术沙龙
专访|360高瀚昭:ISC十年,360数字安全大脑能够“看见”什么?
HackTheBox | Horizontall
年初离职,学习半年源码,终于拿到了蚂蚁Offer,分享面试过程
手把手教你设计一个全局异常处理器
复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
Talking about the underlying data structure of Redis
Pretraining Weekly Issue 56: Long Text Understanding, Instant Question Answering, Mask Self-Supervision
剑指 Offer 66. 构建乘积数组
《预训练周刊》第56期:长文本理解、即时问答、掩码自监督
随机推荐
【小码匠自习室】[NOI Online 2020-2 入门组] 未了:可恶的精度会让你焦头烂额
textarea disable drag and drop
跟我一起了解云耀云服务器HECS【华为云至简致远】
serialize serialize native method
复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
6.【opencv鼠标回调事件】
从零开始,如何拥有自己的博客网站【华为云至简致远】
PostgreSQL 用户与schema有什么区别?
【小码匠自习室】让错误成为孩子进步的阶梯
【os.path】的相关用法(持更)
shell三剑客-----sed命令
Talking about the underlying data structure of Redis
Pretraining Weekly Issue 56: Long Text Understanding, Instant Question Answering, Mask Self-Supervision
设计一个跨平台的即时通讯系统(采用华为云ECS服务器作为服务端 )【华为云至简致远】
LeetCode Daily Question 2022/8/1-2022/8/7
【电路基础2】电容
Ingress:比Service更强大的服务暴露与负载均衡
路由器——交换机——网络交换机:区别
【小码匠自习室】ABC180-C: 马虎是小孩的天性吗?
Experience Sharing | Systematic Design and Development of Business Cache