首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在通过拖放重新排序后,有没有一个函数可以获得新元素的RecyclerView顺序?

在通过拖放重新排序后,可以通过以下函数获得新元素的RecyclerView顺序:

代码语言:txt
复制
public List<Integer> getNewOrder(RecyclerView recyclerView) {
    List<Integer> newOrder = new ArrayList<>();
    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
    if (layoutManager instanceof LinearLayoutManager) {
        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
        int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
        int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
        for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
            newOrder.add(i);
        }
    } else if (layoutManager instanceof GridLayoutManager) {
        GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
        int spanCount = gridLayoutManager.getSpanCount();
        int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition();
        int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
        for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
            int row = i / spanCount;
            int column = i % spanCount;
            int newPosition = column * spanCount + row;
            newOrder.add(newPosition);
        }
    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
        StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
        int spanCount = staggeredGridLayoutManager.getSpanCount();
        int[] positions = new int[spanCount];
        int firstVisibleItemPosition = staggeredGridLayoutManager.findFirstVisibleItemPositions(positions)[0];
        int lastVisibleItemPosition = staggeredGridLayoutManager.findLastVisibleItemPositions(positions)[0];
        for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
            newOrder.add(i);
        }
    }
    return newOrder;
}

这个函数根据RecyclerView的布局管理器类型,分别处理线性布局、网格布局和瀑布流布局。通过调用不同的布局管理器的方法,可以获取到可见范围内的新元素的顺序,并将其添加到一个列表中返回。

这个函数适用于需要在拖放重新排序后获取新元素顺序的场景,例如在一个图片列表中,用户可以通过拖放图片来改变它们的顺序,然后可以使用这个函数获取到新的顺序,以便进行后续的处理。

腾讯云相关产品和产品介绍链接地址:

请注意,以上仅为腾讯云的一些相关产品,其他云计算品牌商也提供类似的产品和服务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

AndroidApp和车机开发:RecyclerView实现触摸和拖放功能

引言 现代应用程序中,用户交互性是提供丰富用户体验关键因素。RecyclerView作为Android中处理列表和网格布局强大组件,支持多种交互,包括拖放排序。...本文指导您如何在RecyclerView中实现拖放功能,使用户能够通过长按和拖动来重新排序列表项,用Kotlin实现 长按和拖放操作 为了为RecyclerView添加长按拖放功能,我们将通过自定义ItemTouchHelper.Callback...来精确控制拖动行为,涉及重写onMove方法和getMovementFlags方法 拖动排序逻辑 onMove:此方法拖动操作期间被调用,用于交换列表项位置,并更新适配器数据源。...函数 适配器中实现 moveItem 函数,用于交换数据集中元素位置,通知 RecyclerView 更新: 比较源位置和目标位置。...考拖动操作期间提供视觉反馈,以增强交互性。 结语 通过上述步骤,可以轻松地Android应用中RecyclerView实现拖放排序功能。

25220

RecyclerView】 十、RecyclerView 数据更新 ( 增加单条数据 | 批量增加数据 )

位置是被新插入 ; 该位置之前元素目前 position + 1 位置 ; int position 参数 : 最新插入元素在数据集中位置 ; 注意 : 调用该方法 , 只会刷新与该位置相关...item 元素 , 不会刷新其它元素 , 即使数据改变了 , 也不会刷新 ; 代码示例 : 集合开始位置插入一个元素 ; // 集合开始添加一个元素...(int position) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup...) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup implements...+ itemCount 位置 ; * * 这是一个结构性变化事件 ; * 表示在数据集中其它元素仍然被认为是最新数据 , 这些数据不会被重新绑定

1.3K00
  • RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )

    (int fromPosition, int toPosition) 方法 , 传入参数是移动前位置和移动位置 ; 该方法作用是通知任何被注册观察者 , fromPosition 位置 item...这是一个结构性变化事件 ; 表示在数据集中其它元素仍然被认为是最新数据 , 这些数据不会被重新绑定 , 尽管它们位置已经发生了变化 ; 也就是说 RecyclerView 只刷新涉及到 fromPosition...(int fromPosition, int toPosition) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView...(int position) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup...* 这样有助于动画和可视化对象持续 , 但是单独 item 元素组件需要重新被绑定 ; * * 如果你正在写一个适配器 , 使用该方法 , 比使用多个指定变化方法

    3.4K00

    RecyclerView】 十二、RecyclerView 数据更新 ( 修改单条数据 | 批量修改数据 )

    (int position) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup...* 这是一个结构性变化事件 ; * 表示在数据集中其它元素仍然被认为是最新数据 , 这些数据不会被重新绑定 , * 尽管它们位置已经发生了变化...参数 : 被修改元素原数据集中首个元素位置索引 ; int itemCount 参数 : 数据集中被修改元素个数 ; 注意 : 这是一个结构性变化事件 ; 表示在数据集中其它元素仍然被认为是最新数据...(int position) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup..., itemCount, null) ; * * 这是一个结构性变化事件 ; * 表示在数据集中其它元素仍然被认为是最新数据 , 这些数据不会被重新绑定

    4.1K00

    RecyclerView】 十一、RecyclerView 数据更新 ( 删除单条数据 | 批量删除数据 )

    (int position) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView extends ViewGroup...位置 ; * * 这是一个结构性变化事件 ; * 表示在数据集中其它元素仍然被认为是最新数据 , 这些数据不会被重新绑定 ,...positionStart 参数 : 被删除元素原数据集中首个元素位置索引 ; ( 旧数据集中索引位置 ) int itemCount 参数 : 数据集中被删除元素个数 ; 注意 : 调用该方法...(int positionStart, int itemCount) 函数原型 : 该函数定义 RecyclerView 内部类 Adapter 中 ; public class RecyclerView...) 目前 oldPosition - itemCount 位置 ; * * 这是一个结构性变化事件 ; * 表示在数据集中其它元素仍然被认为是最新数据

    3.5K00

    Go 切片使用绕坑指南

    不知道大家有没有发现在一个函数内部对切片参数进行了排序也会改变函数外部原来切片中元素顺序,但是函数内向切片增加了元素函数原切片却没有新增元素,更奇怪是添加并排序,外部切片有可能元素数量和元素顺序都不会变...所以函数调用之后,该数组中数字重新排列,函数外部切片与内部切片共享着相同底层数组,所以外部 s 表现出来就是它也被排序了。...s时可以看到它保持了排序顺序,但是之前元素 1去哪了?...如果在将切片填充到容量长度s上再调用 append(),我们将不会再在 main()函数中看到这些更改,因为我们reverse 函数代码将一个新切片指向到了一个完全不同数组。...同样,如果我们向s2附加新元素,最终导致其超出支持数组,我们将不再看到对一个切片更改会影响另一个切片。 严格来说,这不是一件坏事。

    1.2K20

    由旋转画廊,看自定义RecyclerView.LayoutManager

    一、简介 前段时间需要一个旋转木马效果用于展示图片,于是第一时间github上找了一圈,找了一个还不错控件,但是使用起来有点麻烦,始终觉得很不爽,所以寻思着自己做一个轮子。...RecyclerView是google官方support.v7中提供一个控件,是ListView和GridView升级版。...一个for循环中,先判断已经显示Item是否已经超出了显示范围,如果是,则回收改Item,否则更新Item位置。...当用户滑动控件时,会回调scrollHorizontallyBy()方法对Item进行重新布局。 我们先忽略第一句代码,mAnimation用于处理滑动停止Item居中显示。...因此,在这里,我们通过以上定义LayoutManager计算了当前显示Item中间位置,然后对Item绘制进行了重新排序。 最后将计算出来顺序优先级返回给RecyclerView进行绘制。

    2.8K51

    Android开发3年,九月份面试12家大厂跳槽成功,我有一些面试经验想分享给你们

    B站 一个大致有序数组如何排序,最快时间复杂度 如果叫你实现,你会怎样实现一个多主题效果 如何自定义实现一个FlexLayout tinker原理是什么,还用过什么热修复框架,robust原理是什么...原理 项目中有直接使用tcp,socket来发送消息吗 如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅 生命周期都是通过什么调用?有用过AIDL吗?...快手三面 viewModel原理,为什么可以Activity销毁保存数据 mvvm双向数据绑定原理是怎样?ViewModel 说说你们项目中难点是怎样?...可以获得宽高,有看过view.post源码吗?...kotlin空安全原理是什么? 性能优化做过什么工作?有用过什么工具?有没有精确测量工具? kotlinc与javac编译字节码有什么区别? 你团队中是怎样一个角色?

    1.6K10

    程序猿修仙之路--数据结构之设计高性能访客记录系统

    缓存篇章今日暂且不说,说一下以上第二点,也就引出了今日数据结构主角:链表 链表 链表百科:链表是一种物理存储单元上非连续、非顺序存储结构,数据元素逻辑顺序通过链表中指针链接次序实现。...当然如果是首位置插入新元素,只需要把新元素Next指针指向链表首元素即可,同理,如果要在单链表尾部插入新元素,只需要把单链表尾部元素Next指针指向新元素。...假如A开始位置是N,我删除N位置数据时候,需要查找N-1位置元素修改其指针指向,如果是单链表由于当前位置N元素中没有N-1位置元素信息,所有需要重新遍历链表。...如果是双向链表呢,位置N元素中保存了位置N-1元素,所以没有必要在重新遍历链表了,这也是双向链表对比单链表优势,虽然内存占用上多了一个指针内存大小,但是实际应用场景中更为常用。...对同一个空间访问,必然存在锁和多线程问题。所以我选择框架时候优先选择了基于Actor模型框架。避免了一个用户空间上加锁操作。 4.

    56920

    recycleview优化_recyclerview原理

    1.3 RecyclerView缓存寻找过程: RecyclerView找到可用ViewHodler顺序是:如果在缓存CacheViews中找到,则直接复用;如果在缓存池RecycerViewPool...RecyclerView元素比较高,一屏只能显示一个元素时候,第一次滑动到第二个元素会卡顿。...这个机制会导致一个问题,启动应用之后,屏幕可见范围内,如果只有一张卡片可见,当滚动时 候,RecyclerView找不到可以重用view了,它将创建一个,因此滑动到第二个feed时候就会有一定延时...通过setDrawingCacheEnabled把cache打开,再调用getDrawingCache就可以获得viewcache图片,如果cache没有建立,系统会自动调用buildDrawingCache...ViewHolder不会重新创建,也不会重新bindView,这样某些ItemView图片是View属性动画变换图片,导致不是自己想要结果。

    4.1K21

    文心一言 VS 讯飞星火 VS chatgpt (68)-- 算法导论6.5 7题

    文心一言: 优先队列是一种数据结构,其中每个元素都有一个关联优先级或权值。优先队列中,元素按照它们优先级被排序,使得较小优先级先被处理。因此,我们可以使用优先队列来实现先进先出队列。...heapq,其中 heappush 函数用于将元素插入到队列末尾,并根据元素优先级进行排序;heappop 函数用于弹出队列中最小优先级元素,并返回该元素值。...heapq,其中 heappraise 函数用于将元素插入到栈末尾,并根据元素优先级进行排序。...• 若要实现先进先出特性,可以将元素入队顺序作为其优先级,并且将其作为额外数据存储元素中。 • 当需要出队时,只需从优先队列中取出优先级最高且入队顺序最早元素即可。...使用优先队列实现栈: 虽然优先队列通常是基于元素优先级进行排序,但可以通过修改入队规则来使用优先队列实现栈。

    15910

    关于RecyclerView你知道不知道都在这了(上)前言目录正文

    : 第一个构造函数 //用法(Activity里初始化控件): LinearLayoutManager layoutManager = new LinearLayoutManager(this);...第二个构造函数 //用法(Activity里初始化控件): //第二个参数就是用于指定方向是竖直还是水平,第三个参数用于指定是否从右到左布局,基本都是false,我们习惯都是左到右排列方式 LinearLayoutManager...也就是说,上面说了有两种场景会触发到该方法开启回收工作,但实际上,第一种场景内部默认工作中就包含了回收工作,那么有没有通过这个方法来开启并没有任何影响。...setSpanCount() 通过构造函数指定了 spanCount 也还可以继续通过该方法进行修改 LinearLayoutManager 方法 由于是继承关系,所有 LinearLayoutManager...相反,当 Item 移进屏幕内时,另一个方法则会回调。 那么,其实,一定场景下,可以通过这两个回调来处理一些 Item 移出屏幕,移进屏幕所需要工作。

    3.1K60

    JavaScript秘密笔记 第三集

    : 希望通过下标名称,快速获得想要数组元素时 如何: 创建: 2步: 1....如何判断一个数组是空数组: 无缝拼接,依然是空字符串,说明是空数组 arr.join("")==="" 4....***排序: 什么是: 将数组中元素,按从小到到或从大到小顺序重新排列 为什么: 便于快速查找和维护 何时: 今后只要多个数据显示给用户前,必须都要先排序! 如何: 1....: 什么是比较器函数: 专门比较任意两数大小函数 何时: 只要用arr.sort() 对数字类型元素进行排序时,都要自定义比较器函数 如何: 2步: 1....arr.sort(compare); 强调: 不要加() 回调: 将一个函数交给另一个函数去自动调用 不加(): 1. 不止调用一次! 2. 每次调用,传什么参数,不确定! 3.

    63200

    当大潮退去没有谁还能Android这行“裸泳”,10家大厂面试题,掌握这些让你轻松面试

    B站 1.一个大致有序数组如何排序,最快时间复杂度 2.如果叫你实现,你会怎样实现一个多主题效果 3.如何自定义实现一个FlexLayout 4.tinker原理是什么,还用过什么热修复框架,robust...原理 10.项目中有直接使用tcp,socket来发送消息吗 11.如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅 12.生命周期都是通过什么调用?有用过AIDL吗?...11.kotlin lazy使用,lazy viewmodel 12.有没有看一下Google官方ViewModel demo 13.ViewModelActivity初始化与Fragment中初始化...快手三面 1.viewModel原理,为什么可以Activity销毁保存数据 2.mvvm双向数据绑定原理是怎样?ViewModel 3.说说你们项目中难点是怎样?...4.kotlin空安全原理是什么? 5.性能优化做过什么工作?有用过什么工具?有没有精确测量工具? 6.kotlinc与javac编译字节码有什么区别? 7.你团队中是怎样一个角色?

    1K20

    【数据结构与算法】:插入排序与希尔排序

    1.排序基本概念与分类 排序是一种将一组对象按照某种特定顺序重新排列过程。计算机科学中,排序是数据处理中非常基本且重要操作,它可以帮助人们更有效地理解和分析数据。...简单来说,如果排序前两个相等元素A和B(A出现在B之前),排序A仍然出现在B之前,那么这种排序算法就是稳定;反之,如果排序A和B顺序发生了变化,这种排序算法就是不稳定。...例如,在对一组人按出生日期排序时,如果有两个人出生日期相同,我们可能会希望他们排序保持按姓名顺序,如果使用稳定排序算法,就可以保证这一点。...我们来逐步分析插入排序算法来说明其稳定性: 排序初始时,认为第一个元素自成一个排序序列 从第二个元素开始,取出未排序一个元素,排序序列中从后向前扫描 如果当前扫描到元素大于新元素(待插入...),那么将扫描到元素向后移动一个位置 重复步骤3,直到找到一个元素小于或等于新元素位置,或者序列已经扫描完毕 将新元素插入到这个位置后面 步骤4中,插入排序算法逻辑保证了如果存在相等元素,新元素

    8210

    基于自然流布局可视化拖拽搭建平台设计方案

    但是如果一定要实现嵌套和层功能, 有没有另一种更简单方案呢?...笔者目前想到了两种解决方案: 将智能布局改为自由布局, 即可以采用类似 react-resizable 这种方案 基于自然流来实现, 也就是抹去定位概念, 完全基于元素文档顺序, 层级和定位选择权交给用户...首先我们来看看一个完整拖放过程: 首先要设置一个元素可拖放(比如) 设计拖动时候会发生什么(需要用到ondragstart事件 和 setData(你要传递数据...所以这里我们调研了一种方案——拖拽排序机制. 自然流布局规律就是默认情况下html页面是基于dom出现顺序来排列, 也就是我们说堆叠. ?...我们可以遵循这样设计, 通过排序方式改变组件位置从而实现自然流布局页面搭建.

    1.8K30

    C++基础 STL简介

    新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个数组,然后将全部元素移到这个数组。...但是无论如何,重新分配都应该是对数增长间隔大小,以至于末尾插入一个元素时候是常数时间复杂度完成。...因为**元素被修改,容器并不会自动重新调整顺序**,于是容器有序性就会被破坏,再在其上进行查找等操作就会得到错误结果。...因为 multimap 中元素是按照关键字排序,当关键字被修改,容器并不会自动重新调整顺序,于是容器有序性就会被破坏,再在其上进行查找等操作就会得到错误结果。...它们都是顺序容器基础上实现,屏蔽了顺序容器一部分功能,突出或增加了另外一些功能。 容器适配器都有以下三个成员函数: push:添加一个元素。

    68320

    数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现

    插入排序简介 插入排序是一种简单直观排序算法,它也是基于比较排序算法。它工作原理是通过不断扩张有序序列范围,对于未排序数据,排序中从后向前扫描,找到相应位置并插入。...具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,已经排序元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序元素小于或者等于新元素位置...将新元素插入到该位置 重复步骤2~5 假设我们要对数组{12,4,5,2,6,14}进行插入排序排序过程为: image.png 2.1....我们定义一个二分查找函数函数返回插入位置下标: /*二分查找函数,返回插入下标*/ template int BinarySearch(T array[], int start...稳定性 二分插入排序是稳定。元素相对顺序排序不会被改变。 原创文章,转载请注明: http://www.cnblogs.com/QG-whz/p/5194569.html

    1.4K30
    领券