scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除

九宫格图片布局,长按直接拖拽图片,长按时显示底部删除布局,拖拽到删除布局处松手可删除布局,最后添加按钮不可拖拽,基于 BaseQuickAdapter 基础上实现

scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除

BaseQuickAdapter 确实很好用,简化我们的实现代码,它本身也集成了一套拖拽实现,不过目前无法完美的满足上面的需求,需要做一些修改

1、首先自定义好九宫格布局,末尾是一个 + 号,这个加号无法拖拽,这里 + 号最好是用图片,更方便

2、在 adapter 中重写 addDraggableModule 方法,这里我直接自定义了自己的 DraggableModule ,因为我需要替换默认的监听事件,达到我自己的目的

scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除

核心逻辑就集中在 PhotoDraggableModule 中,否则自带的拖拽没发监听拖拽的距离,不好计算是否拖拽到了底部

源码中在 module 初始化的时候就已经把监听初始化了,所以在不替换的情况下,很难达到自己的需求

scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除

其实就是 DragAndSwipeCallback ,自己定义有点麻烦,还不如不用这套拖拽封装了,所以为了简化,只能继续用它,在它的基础上计算自己的拖拽距离就行了

直接在 module 中的 init 方法里 重新创建监听,去替换原有的 callback,这样就方便自己获取数据操作了

init {
        itemTouchHelperCallback = object : DragAndSwipeCallback(this) {
            override fun onChildDraw(
                c: Canvas,
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                dX: Float,
                dY: Float,
                actionState: Int,
                isCurrentlyActive: Boolean
            ) {
                super.onChildDraw(
                    c,
                    recyclerView,
                    viewHolder,
                    dX,
                    dY,
                    actionState,
                    isCurrentlyActive
                )
                if (callBack == null) return

                if (isCurrentlyActive) {
                    viewHolder.itemView.visibility = View.VISIBLE
                    if (dY.toInt() == 0) {
                        isDel = false
                        callBack?.touchStart()
                    } else if (dY > 0) {
                        //拖到指定区域
                        val bottom = (recyclerView.parent.parent as View).bottom + dY
                        val bottomY =
                            bottom - (recyclerView.bottom - viewHolder.itemView.bottom) - (scrollView?.scrollY
                                ?: 0)
                        //是否在删除区域
                        isDel = bottomY >= bottomDelTopY
                        callBack?.touchMove(isDel)
                    }
                } else {
                    val delPosition = if (isDel) viewHolder.layoutPosition else null
                    //松开先隐藏,预防松开后item回到列表在执行删除动画
                    viewHolder.itemView.visibility = if (isDel) View.INVISIBLE else View.VISIBLE
                    callBack?.touchUp(delPosition)
                    isDel = false
                }
            }

            @SuppressLint("NotifyDataSetChanged")
            override fun clearView(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder
            ) {
                super.clearView(recyclerView, viewHolder)
                viewHolder.itemView.visibility = View.VISIBLE
                //等待布局操作结束执行刷新,避免下方异常
                //Cannot call this method while RecyclerView is computing a layout or scroll
                viewHolder.itemView.post {
                    baseQuickAdapter.notifyDataSetChanged()
                }
            }
        }
        itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
    }

3、计算拖拽距离

如果没有被 scrollView 嵌套,直接通过拖拽的距离就能判断是否到底部了,但是一般情况下都需要你可滑动,就会需要嵌套一层 scrollVIew

根据上面代码看出,其实就是需要获取 scrollView 的滚动距离,从中得出你拖拽的距离是否到底部了,这里用 isDel 来控制执行次数,否则会重复调用多次

4、最后在回调监听中处理拖拽的动画和删除操作

 

原文链接:https://www.cnblogs.com/LiuZhen/p/17134379.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:scrollView 嵌套 recyclerview 时 BaseQuickAdapter 九宫格图片拖拽到底部删除 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • Viu联合华为HMS生态,共创影音娱乐新体验

    华为HMS生态携手流媒体平台Viu,为海外消费者打造精品移动娱乐应用体验,并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务,支持优质视频内容高清点播和直播。自2019年起,Viu在中东非区域与华为HMS生态开展一系列紧密合作,并在2022年实现47%的用户增长。 本次,华为邀请Viu中东非区域首席业务官Rohit D…

    Android 2023年4月22日
    00
  • 修改安卓ID为硬件唯一ID

    前言: 最近接到个需求,我们新产品上的外包侧APP需要使用硬件唯一ID(不管怎么升级怎么操作,ID始终不变和硬件绑定),用来做权限校验。 由于了解到安卓ID或序列号都会在擦除升级后重新随机生成,所以这里使用硬件上的ID来作为唯一ID,接下来进入正题 此篇以安卓7.1系统为例 一,常用硬件信息ID 这里列举一些常用的一芯一码ID查询获取方式 1. CPU ID…

    Android 2023年4月18日
    00
  • 游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

    华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力,支持玩家直接在游戏内浏览帖子和交流互动,助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区? 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在游戏内绘制论坛入口,为玩家提供沉浸式发帖、浏览、点赞、回帖、参与投票等各类互动体验。 说明:您可根据游戏风格,自定义论坛…

    Android 2023年4月18日
    00
  • Android报”OutOfMemoryError”如何解决?

    针对Android报”OutOfMemoryError”异常的原因和解决办法,我会给您提供详细讲解。我们先来看一下什么是”OutOfMemoryError”。 什么是”OutOfMemoryError”? 在Java中,程序运行时经常会需要占用内存资源,对于Android应用而言,相对于Java来说,其内存受到了更大的限制,当程序占用的内存超过了系统为其分配…

    Android 2023年4月3日
    00
  • 预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU

    【导读】 日常运营过程中,消息推送是App触达用户的常用手段,无论是新功能的通知,还是活动的提醒,都可以通过推送告知用户。千人千面的个性化推送,对于提升用户粘性、用户转化等指标都具有明显正向效果。越来越多的应用选择华为Push用户增长服务作为拉新、促活的首选渠道,他们选择的理由是什么?他们又是如何持续提升用户月活量级并有效促进后端转化的? 本期直播《高效促活…

    Android 2023年4月17日
    00
  • (转)java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.

    jar包下载方式官网地址:MySQL :: Download Connector/J,如果你打不开官网,在下面我为你准备了直接下载jar包的链接地址。 在选择操作系统时,此处选择platform independent(独立于平台)。   8.0版本的jar包下载地址,点击直接下载。 https://dev.mysql.com/get/Downloads/C…

    Android 2023年4月27日
    00
  • Android Studio相关问题

    下载 去官网下载即可,最新版如果运行不了,可选择安装其他版本,我安装的就是4.0版本 建立项目 一般就是建立一个空项目 如果使用过idea,那么建立项目就很简单。因为Android Studio和 idea 界面都差不多,功能也类似 步骤: File——New——New Project 会出现以下画面: 然后选择 Empty Activity 再点击 Nex…

    Android 2023年5月8日
    00
  • 【FAQ】集成分析服务的常见问题及解决方案

    常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下: HiAnalyticsInstance instance = HiAnalytics.getInstance (this);…

    Android 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部