RecyclerView ItemTouchHelper.Callback:拖动交换条件

2023-12-27

我想以这样的方式实现拖动卡片:当我拖动的卡片与元素不完全重叠而仅重叠 50% 时,卡片就会开始重新排列。

看一个例子:

现在,为了将右侧的卡片移至左侧,我需要将其与我正在拖动的卡片完全重叠。

我尝试从 ItemTouchHelper.Callback 重写此方法:

 public float getMoveThreshold(@NonNull ViewHolder viewHolder) {
     return .5f;
 }

但这没有帮助。

那么如何才能使交换发生在 50% 而不是 100% 重叠的情况下呢?


经过多次尝试,我自己找到了解决方案:

您需要重写 ItemTouchHelper.Callback 中的 ChooseDropTarget 方法。

我就是这样做的:

  //  x ≥ 0.5 (if less than 0.5, it will shake due to constant overlap)
val DRAG_THRESHOLD_PERSENT = 0.5
override fun chooseDropTarget(
    selected: ViewHolder,
    targets: MutableList<ViewHolder>,
    curX: Int, curY: Int
): ViewHolder? {
    val verticalOffset = (selected.itemView.height * DRAG_THRESHOLD_PERSENT).toInt()
    val horizontalOffset = (selected.itemView.width * DRAG_THRESHOLD_PERSENT).toInt()
    val left = curX - horizontalOffset
    val right = curX + selected.itemView.width + horizontalOffset
    val top = curY - verticalOffset
    val bottom = curY + selected.itemView.height + verticalOffset
    var winner: ViewHolder? = null
    var winnerScore = -1
    val dx = curX - selected.itemView.left
    val dy = curY - selected.itemView.top
    val targetsSize = targets.size
    for (i in 0 until targetsSize) {
        val target = targets[i]
        if (dx > 0) {
            val diff = target.itemView.right - right
            if (diff < 0 && target.itemView.right > selected.itemView.right) {
                val score = abs(diff)
                if (score > winnerScore) {
                    winnerScore = score
                    winner = target
                }
            }
        }
        if (dx < 0) {
            val diff = target.itemView.left - left
            if (diff > 0 && target.itemView.left < selected.itemView.left) {
                val score = abs(diff)
                if (score > winnerScore) {
                    winnerScore = score
                    winner = target
                }
            }
        }
        if (dy < 0) {
            val diff = target.itemView.top - top
            if (diff > 0 && target.itemView.top < selected.itemView.top) {
                val score = abs(diff)
                if (score > winnerScore) {
                    winnerScore = score
                    winner = target
                }
            }
        }
        if (dy > 0) {
            val diff = target.itemView.bottom - bottom
            if (diff < 0 && target.itemView.bottom > selected.itemView.bottom) {
                val score = abs(diff)
                if (score > winnerScore) {
                    winnerScore = score
                    winner = target
                }
            }
        }
    }
    return winner
}

怎么运行的:
我正在使用因子和宽度/高度计算所选视图的偏移量。之后,我创建新的边框(左、右、上、下),向所选视图的边框添加偏移量,然后在方法中使用它们而不是原始边框

重要的:

  • 你不应该调用 super
  • 系数必须大于0.5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RecyclerView ItemTouchHelper.Callback:拖动交换条件 的相关文章

随机推荐

  • 操作系统和 javascript/HTML5 可以访问本地存储吗?

    我想在浏览器关闭时使用操作系统读取浏览器的 本地存储 我想将客户端数据保存在本地存储中 然后关闭浏览器和互联网 然后让操作系统程序 Windows exe 访问和分析该数据 然后将新数据写入该本地存储区域 以便当浏览器重新启动新数据时数据在
  • 使用 ChartJS 在 Django 中生成多个折线图

    我正在 Django 中工作 在我的模块的功能中绘制一些图表 即 如果我有 2 个模块 我想要 2 个图表 如果有 8 个模块 我想要 8 个图表 模块集成在插件中 这样我就可以列出插件中找到的所有模块 我在 Django 中做了这个 de
  • Express + AngularJS + HTML:ng-include 不起作用(404 - 页面未找到错误)

    我是新来的AngularJS 我正在尝试使用ng include在我的主 HTML 页面中包含外部 HTML 页面 但问题是我无法包含它并得到 404 以下是文件夹结构和代码 项目文件夹结构 按钮 Click jade 这是起始页 doct
  • 在 Vim 中启用 Markdown 突出显示

    我在装有 OS X Lion 的 MacBook Air 终端上使用 Vim 但我似乎找不到一个好的 Markdown 语法突出显示插件 到目前为止我已经尝试过塑料男孩 https github com plasticboy vim mar
  • 将哈希表数据集合导出到 CSV

    我正在尝试将集合哈希表项的名称 值对导出到 CSV 我还没有找到代码的选择对象部分的正确语法 我希望 CSV 文件具有 Url 和 Owner 的列 谢谢您的帮助 System Collections ArrayList collectio
  • Hive from_unixtime 毫秒

    我们在 Hive 中存储了一个时间戳纪元列 BIGINT 我们想要获取该纪元的日期 yyyy MM dd 问题是我的纪元以毫秒为单位 例如1409535303522 因此 选择时间戳 from unixtime timestamp yyyy
  • 用户输入和输出在我的汇编代码中不起作用

    以下程序编译时没有错误 但运行时不会提示任何输入 也不会打印任何内容 有什么问题 我该如何解决它 我使用这些命令来组装和链接 usr local bin nasm f macho32 1 ld macosx version min 10 9
  • Swift 4 Decodable - 以枚举为键的字典

    我的数据结构有一个枚举作为键 我希望下面的内容能够自动解码 这是一个错误还是某些配置问题 import Foundation enum AnEnum String Codable case enumValue struct AStruct
  • selenium / capybara - 无法加载 Firefox 配置文件

    当我使用 selenium 运行测试时 浏览器会反复弹出 指出找不到 firefox 配置文件 我准备了一个与 selenium 一起使用的 Firefox 配置文件 我只是不确定如何告诉 selenium 该配置文件所在的位置 我如何告诉
  • 加载 Magento 页面时出现奇怪的错误

    当我加载前端时 我的浏览器返回那些奇怪的错误 Uncaught ReferenceError Mage is not defined Uncaught ReferenceError Varien is not defined Uncaugh
  • 会话存储安全吗?

    我想使用会话存储来查询数据库中的用户数据一次 然后简单地使用JS来检索它 所以我正在考虑使用会话存储 接下来我的问题是 这样安全吗 请注意 1 JS 无法插入到带有表单的页面 表单只接受字母数字值 因此它只能来自 URL 1 1php 中不
  • Python - 通过代理使用socket.gethostbyname

    我正在使用 TOR 来代理连接 但在代理 DNS 查找时遇到困难socket gethostbyname www yahoo com 我通过使用wireshark 嗅探流量了解到它没有通过代理发送DNS 流量 这是我正在使用的代码的副本 i
  • 如何更改VS的编译器?

    我正在使用 VS 2010 我更改了编译器 C 代码而不是 C 的设置 它工作正常 但问题是 MS 编译器不支持 C99 标准 因此我正在寻找可以与 VS 10 一起使用的 C 编译器 如何做到这一点 提前致谢 MS Visual Stud
  • 我怎样才能知道我的日历意图的结果?

    从我的应用程序中 我启动日历的目的是 Calendar cal Calendar getInstance Intent intent new Intent Intent ACTION EDIT intent setType vnd andr
  • 返回 varchar(max) 存储过程的输出参数截断为 4000 个字符

    我有一个带有 SQL2012 数据库的经典 ASP 应用程序 我最近将表列从 varchar 8000 更改为 varchar max 因为它不够大 无法存储所需的数据 我可以使用需要存储的所有数据更新列 但我用来返回列数据作为输出参数的
  • EKEventStore.calendars 返回不存在的“日历”对象

    当使用 IOS5 获取所有日历时 EKEventStore eventStore EKEventStore alloc init NSArray calendars eventStore calendars 返回了一个名为 calendar
  • iOS 13 设备上语音识别(支持OnDevice Recognition 标志)

    我正在尝试让 iOS 13 OnDevice 语音识别正常工作 但是 验证 supportOnDeviceRecognition 标志 这是启用 OnDevice 识别的初步步骤 始终返回 false 我使用的是装有 iOS 13 3 的第
  • 如何在 Flutter 中构建 apk 创建旧版本应用程序

    我正在尝试在 Flutter 中构建我的发布应用程序 当我运行时 flutter run 在调试和测试模式下一切正常 但是当我尝试使用以下方法构建发布应用程序时 flutter build apk 它创建了我的一个旧的首次发布应用程序 我之
  • 打印 Haskell 的评估(重写)步骤以用于教育/学习目的。是否可以?

    我用书上的例子来描述这个问题 Simon Thompson 的书 HASKELL 函数式编程的技巧 第 82 页 见下图 显示了以下评估步骤 fac 4 问题 是否可以使用某些工具或 Haskell 调试器 来写出 GHCi 在评估以下值时
  • RecyclerView ItemTouchHelper.Callback:拖动交换条件

    我想以这样的方式实现拖动卡片 当我拖动的卡片与元素不完全重叠而仅重叠 50 时 卡片就会开始重新排列 看一个例子 现在 为了将右侧的卡片移至左侧 我需要将其与我正在拖动的卡片完全重叠 我尝试从 ItemTouchHelper Callbac