Android用RecyclerView实现图标拖拽排序以及增删管理

1. 效果图

2. 基本的功能

在非编辑状态下可以直接点击图标进行跳转
在编辑状态可以拖拽、添加、删除操作
已被添加过的不能再次添加

3. 实现的思路

用两个RecyclerView实现,同时维护两个数据源,上部是常用应用,最多可以放8个;下部是全部应用。

1. 每个应用图标的状态用枚举Option表示

// 当前的操作状态
enum class Option {
 ADD, REMOVE, NONE
}

2. 在处于编辑状态时创建ItemTouchHelper对象并attch到RecyclerView上

if (enable) {
 itemTouchHelper.attachToRecyclerView(binding.rvApps)
}

其中,在实现ItemTouchHelper.Callback接口的onMove() 函数中,此时表示用户已经抬手,而图标位置已经发生了变动,此时将界面上图标的顺序同步回Adapter的数据源中:

val newData = mutableListOf<Pair<String, Int>>()
commonAppsAdapter.data.forEachIndexed { index, _ ->
 val holder = recyclerView.findViewHolderForAdapterPosition(index) as AppsHolder
 newData.add(Pair(holder.funcUrl, index))
}
for (i in newData) {
  val sameFuncIndex = commonAppsAdapter.data.indexOfFirst { i.first == it.uid }
  Collections.swap(commonAppsAdapter.data, i.second, sameFuncIndex)
}

3. 当应用图标从上部被删除时,需要将其添加到下部,并将其重新设为可添加状态

commonAppsAdapter.onRemoveBtnClickListener = object : OnRemoveBtnClickListener {
 override fun onClick(view: View, appBean: AppBean) {
  val theSameElementIndex = allAppsAdapter.data.indexOfFirst { it.uid == appBean.uid }
  if (theSameElementIndex < 0) return
  allAppsAdapter.data[theSameElementIndex].option = AppBean.Companion.Option.ADD
  allAppsAdapter.notifyItemChanged(theSameElementIndex)
 }
}

源码请前往Github

以上就是Android用RecyclerView实现图标拖拽排序以及增删管理的详细内容,更多关于Android 实现图标拖拽排序以及增删管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android RecyclerView实现悬浮吸顶、分隔线、到底提示效果

    本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui,github地址 一.顶部吸附效果图 二.顶部不吸附效果图 三.不满一屏效果 四.核心实现点 1.为什么通过ItemDecoration能够实现,原理? ①通过getItemOffsets()方法获取当前模板view的left.top.right.bottom边距,这些留出的间距用于绘制这些辅助性ui. // RecyclerView的measure c

  • Android无限循环RecyclerView的完美实现方案

    背景 项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,所以就需要一些办法让它能够无限循环. 方案选择 方案1 对Adapter进行修改 网上大部分博客的解决方案都是这种方案,对Adapter做修改.具体如下 首先,让 Adapter 的 getItemCount() 方法返回 Integer.MAX_VALUE,使得position数据达到很大很大: 其次,在 onBindViewHolder() 方法里对p

  • 解决Android-RecyclerView列表倒计时错乱问题

    前言 转眼间距离上次写博客已是过了一个年轮,期间发生了不少事:经历了离职.找工作,新公司的第一版项目上线.现在总算是有时间可以将遇到的问题梳理下了,后期有时间也会分享更多的东西-- 场景 今天分享的问题是当在列表里面显示倒计时,这时候滑动列表会出现时间显示不正常的问题.首先关于倒计时我们需要注意的问题有以下几方面: 在RecyclerView中ViewHolder的复用导致的时间乱跳的问题. 滑动列表时倒计时会重置的问题. 在退出页面后定时器的资源释放问题,这里我使用的是用系统自带的CountD

  • Android RecyclerView网格布局示例解析

    一个简单的网格布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/ap

  • Android实现的RecyclerView适配器

    这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足. 源码地址: GitHub 功能 无需继承 Adapter, 无需判断 item 类型. 支持页头和页脚. 支持自动展示空数据界面. 通过 Kotlin 的 lambda 大量缩减代码. 支持全局 Item 类型 支持 diff 刷新 使用 添加依赖 implementation "com.dengzii.adapter:$latestVersion&q

  • Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)

    Android中RecyclerView点击item展开列表详细内容 效果如下: 依然是xml文件的设计,使用了两个RelativeLayout,zu作为主布局和副布局,里面都加入textview显示内容,在副布局里加入一个imageview在这里插入图片描述作为子内容的背景图,代码如下: tab01.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&qu

  • Android自定义RecyclerView实现不固定刻度的刻度尺

    本文实例为大家分享了自定义RecyclerView实现不固定刻度的刻度尺的具体代码,供大家参考,具体内容如下 ##不均匀刻度效果图 ##等比例刻度效果图 实现功能目前 1.实现类似日期/分类等大小不固定的水平刻度尺效果 2.实现标准刻度尺效果 3.监听RecyclerView滑动时居中条目 4.去掉边缘阴影 定义RecyclerView public class CenterRecyclerView extends RecyclerView { //设置RecyclerView的速度 priva

  • Android Filterable实现Recyclerview筛选功能的示例代码

    原先碰到筛选这种功能时,后端的接口都会让上传一个字段,根据字段来返回相应的数据.后来一次和别人对接时,接口直接返回全部数据,而且还要实现筛选功能.我...我说不就是一条sql语句的事,改接口多方便,我苦心劝导,然后被怼回来,切,不就是筛选嘛,求人不如自己搞. 1. 效果图 2. 思路 既然是筛选,那就少不了比较.也没有什么好的办法,无非就是循环对比,然后将适配器进行数据更新.页面刷新即可.但筛选的调用要方便,怎么比较才方便我们调用呢?偶然间看到了Filterable,使Adapter继承自该接口

  • Android列表RecyclerView排列布局

    本文实例为大家分享了Android列表RecyclerView排列布局的具体代码,供大家参考,具体内容如下 效果图: 1.要添加相关的依赖 implementation 'androidx.recyclerview:recyclerview:1.1.0' 2.然后布局文件中准备容器 这个标签是显示目标容器对象的,其他需求可自定义 <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_list" android

  • Android RecyclerView实现滑动删除

    本文实例为大家分享了RecyclerView实现滑动删除的具体代码,供大家参考,具体内容如下 package com.example.demo; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.Lin

随机推荐