当前位置: 首页 > news >正文

RecyclerView 拖拽与滑动操作

RecyclerView 是 Android 中用于高效展示大量列表项的组件。通过配合 ItemTouchHelper 工具类,可以轻松实现列表项的拖拽(Drag)与滑动删除或移除(Swipe)功能,无需依赖第三方库。

在这里插入图片描述

基础

ItemTouchHelper 与 ItemTouchHelper.Callback

1. 支持拖动与滑动

结合 ItemTouchHelper,可以通过配置拖动方向和滑动方向,实现上下拖动、左右滑动等交互。

2. 实现接口方法

public abstract int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder);
  • 指定哪些动作可被支持(拖动上下、滑动左右等),通常使用 makeMovementFlags() 来构建
public abstract boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target);
  • 响应拖拽,将项从一个位置移动到另一个位置,需要更新数据源并调用 notifyItemMoved()
public abstract int getMovementFlags(RecyclerView recyclerView, ViewHolder viewHolder);
public abstract boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, ViewHolder target);
public abstract void onSwiped(ViewHolder viewHolder, int direction);
  • 响应滑动,执行例如删除项的操作,并调用 notifyItemRemoved()

3. 与 Adapter 解耦

通常设计一个接口,例如 ItemTouchHelperAdapter,包含 onItemMove(…) 与 onItemDismiss(…),由 RecyclerView 的 Adapter 实现数据更新逻辑

4. 绑定 ItemTouchHelper

ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback(adapter);
ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
touchHelper.attachToRecyclerView(recyclerView);

进阶

此部分主要探讨如何为拖拽增加手柄(handle)、在网格布局中运用拖拽,以及添加自定义动画。

1. 拖拽手柄

如果希望只有在特定 View(如一个“拖动图标”)被按住时才启动拖拽,则需要调用 ItemTouchHelper.startDrag(ViewHolder),而不是开启长按即拖

2. 支持网格布局

在使用 GridLayoutManager 或 StaggeredGridLayoutManager 时,你可以按行列方向配置允许拖动的方向

3. 自定义动画和视觉反馈

  • 重写 onSelectedChanged() 和 clearView() 来在拖拽开始与结束时修改选中项的视觉(如背景色变更等)
  • 配合 ItemAnimator 可实现平滑位移动画

封装实现

定义触控回调

class MyItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter? = null) :ItemTouchHelper.Callback() {override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {// 支持向上向下拖拽,向左滑动val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWNval swipeFlags = ItemTouchHelper.START // 或 ENDreturn makeMovementFlags(dragFlags, swipeFlags)}override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder): Boolean {adapter.onItemMove(viewHolder.bindingAdapterPosition, target.bindingAdapterPosition);return true;}override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {adapter.onItemDismiss(viewHolder.bindingAdapterPosition);}override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?
http://www.dtcms.com/a/332089.html

相关文章:

  • HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text
  • 多列集合---Map
  • 【无标题】设计文档
  • Cache的基本原理和缓存一致性
  • 基于大语言模型的爬虫数据清洗与结构化
  • 可信搜索中的多重签名
  • 系统日常巡检脚本
  • 将mysql数据库表结构导出成DBML格式
  • Qt---Qt函数库
  • ActionChains 鼠标操作笔记
  • # Vue 列表渲染详解
  • AI智能体|扣子(Coze)搭建【批量识别发票并录入飞书】Agent
  • FTP 服务详解:原理、配置与实践
  • 8月14日星期四今日早报简报微语报早读
  • [激光原理与应用-273]:理论 - 波动光学 - 光是电磁波,本身并没有颜色,可见光的颜色不过是人的主观感受
  • 时钟 中断 day54
  • close函数概念和使用案例
  • rustdesk 开源遥控软件
  • 云服务器运行持续强化学习COOM框架的问题
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • C#WPF实战出真汁01--项目介绍
  • linux设备驱动之USB驱动-USB主机、设备与Gadget驱动
  • 【Java|第十九篇】面向对象九——String类和枚举类
  • AI更换商品背景,智能融合,无痕修图
  • Java中加载语义模型
  • Windows bypassUAC 提权技法详解(一)
  • 洗浴中心泡池水过滤系统原理深度解析与工程实践
  • RocketMQ 4.9.3源码解读-客户端Consumer消费者组件启动流程分析
  • 具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?
  • Ansible企业级实战