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

使用ItemTouchHelper从RecyclerView中移除项目时引发UnsupportedOperationException

ItemTouchHelper 是 Android 中用于实现 RecyclerView 项目的拖动和滑动删除功能的工具类。当你尝试使用 ItemTouchHelperRecyclerView 中移除项目时,如果遇到 UnsupportedOperationException 异常,通常是因为数据集(通常是 ListArray)不支持修改操作。

基础概念

  • RecyclerView: 是一个用于展示大量数据列表的视图组件,它比 ListView 更高效,因为它使用了 ViewHolder 模式来重用视图。
  • ItemTouchHelper: 是一个辅助类,用于为 RecyclerView 添加拖动和滑动删除的功能。
  • UnsupportedOperationException: 是 Java 中的一个运行时异常,表示不支持的操作被调用。

可能的原因

  1. 数据集不可修改: 如果你使用的数据集(如 Arrays.asList() 返回的列表)是不可修改的,尝试从中移除元素时会抛出此异常。
  2. 适配器未正确更新: 即使数据集是可修改的,如果适配器没有正确地通知数据变化,也可能导致异常。

解决方案

1. 确保数据集是可修改的

如果你使用的是 Arrays.asList() 创建的列表,它返回的是一个固定大小的列表,不支持添加或删除操作。你可以将其转换为 ArrayList 来解决这个问题。

代码语言:txt
复制
List<MyItem> items = new ArrayList<>(Arrays.asList(initialItems));

2. 更新适配器

确保在移除项目后,适配器能够正确地通知 RecyclerView 数据已经改变。

代码语言:txt
复制
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
    int position = viewHolder.getAdapterPosition();
    items.remove(position);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemRangeChanged(position, items.size());
}

3. 使用 ItemTouchHelper.Callback

创建一个 ItemTouchHelper.Callback 的实例,并在其中处理滑动删除的逻辑。

代码语言:txt
复制
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        int position = viewHolder.getAdapterPosition();
        items.remove(position);
        adapter.notifyItemRemoved(position);
        adapter.notifyItemRangeChanged(position, items.size());
    }
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView);

应用场景

这种功能常见于各种列表应用中,如邮件客户端、待办事项列表、新闻阅读器等,用户可以通过滑动项目来执行删除操作,提供直观便捷的用户体验。

总结

UnsupportedOperationException 异常通常是由于尝试修改不可变的数据集引起的。通过确保使用可变的数据集,并且在移除项目后正确更新适配器,可以解决这个问题。使用 ItemTouchHelper 可以方便地为 RecyclerView 添加滑动删除的功能,提升应用的用户体验。

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

相关·内容

ItemTouchHelper 实现交互动画

同时也开源了生活博客,从12年起,积累共计N篇近100万字,陆续搬到网上,转载请注明出处,谢谢!...上下拖动时与其他item进行位置交换 ItemTouchHelper.Callback本身不具备将两个item互换位置的功能,但RecyclerView可以,我们可以在item拖动的时候把当前item与另一个...左右滑出屏幕时其他item补上 只要在item滑出屏幕时,将对应的数据删掉,再调用RecyclerView的notifyItemRemoved()方法刷新布局即可。...让item执行了两种属性动画而已,在ItemTouchHelper.Callback中有一个方法可以拿到item被拖拽或滑动时的位移变化,那就是onChildDraw()方法,在该方法中设置item渐变和缩放属性动画...itemView而已,当那两个透明缩小的itemView被再次使用时,之前设置的透明度和高度比例已经是0,所以就出现了这种情况,解决方法也很简单,只要在item被移除后,将itemView的透明度和高度比例设置回来即可

3.9K20
  • 怎么简单实现菜单拖拽排序的功能

    3、功能拆解 4、功能实现 4.1、实现接口 自定义一个类,实现ItemTouchHelper.Callback接口,然后在实现方法中根据需求简单配置即可。...,并且在绘制的时候会从集合中遍历所有的分割线绘制。...网格布局,选中变大 列表布局,背景变色 这里用到ItemTouchHelper.Callback中的两个方法,onSelectedChanged和clearView,我们需要在选中时改变视图显示,结束时再恢复.../** * 拖动时回调 */ override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder...} 这段代码其实有点意思的,解读一下: 第一个if判断,避免重复操作,直接return 第二个if判断,调用了destroyCallbacks,在destroyCallbacks里面做了一些移除和回收操作

    1.3K40

    recyclerView源码解析

    1、recyclerView的基本使用使用recyclerView主要需要了解RecyclerViewAdapter、layoutManager。...2、recyclerkView源码解析首先看recyclerView的注释图片adapter:正如前文所诉,RecyclerView.Adapter 负责提供表示数据集中项目的视图。...2.1recyclerView的测量方法从源码可以看出,在mLayout就是LayoutManger为null时,recyclerView会走defaultOnMeasure(),mLayout的自动测量模式就是...使用两个adapter,文本列表的相关逻辑用一个Adapter中实现的,处理Button列表相关的逻辑用另一个Adapter中实现的,这样以来就降低了代码的耦合性,并提高了代码的复用性。...= new ItemTouchHelper(callback); //关联recyclerView itemTouchHelper.attachToRecyclerView(recyclerview

    77200

    Android-Recyclerview常用总结

    概述 在android开发中我们不可避免的会用到Recyclerview,用以替代之前的ListView,GridView,Gallery等.它是support:recyclerview-v7中提供的控件...总结也就一句话:高类聚低耦合.RecyclerView已经标准化ViewHolder,我们自定义的ViewHoler需要继承 RecyclerView.ViewHolder,然后在构造方法中初始化控件....当outRect的左,右,上,下的内容都为0时,itemview和ontRect重叠你感觉只有一个item.类似: ?...image.png 3.RecyclerView之实现滑动删除拖拽排序(首个可以固定) 3.1实现RecyclerView的滑动删除拖拽排序 滑动删除和拖拽必须用到ItemTouchHelper ,我们看它如何使用...(mRecyclerView); 其创建的对象过程中要传一个ItemTouchHelper.CallBack(),它是ItemTouchHelper在拖拽中需要回调的方法,我们只需要在其对应返回的回调方法中处理自己的逻辑就好了

    1.4K30

    Android笔记: 使用RecyclerView打造可拖拽的GridView

    主要就要使用到ItemTouchHelper ,ItemTouchHelper 是support-v7包中加入的一个帮助开发人员处理拖拽和滑动的实现类,它能够让你非常容易实现侧滑删除、拖拽的功能。...()); itemTouchHelper.attachToRecyclerView(recyclerView); 构造方法中需要一个ItemTouchHelper.Callback,ItemTouchHelper...会在拖拽或剔除的时候回调Callback中相应的方法,我们只需在Callback中实现自己的逻辑就可以了。...但是,我们都知道RecyclerView并没有提供OnItemLongClickListener,这个问题我在上一篇博客中已经完美地解决了,就是使用OnItemTouchListener,然后识别触摸手势...,这里给上传送门:RecyclerView无法添加onItemClickListener最佳的高效解决方案,后面我就直接使用上一篇的成果,不重复讲了: recyclerView.addOnItemTouchListener

    1.8K31

    【Android 事件分发】ItemTouchHelper 简介 ( 拖动滑动事件 | ItemTouchHelper.Callback 回调 )

    事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递...就可以使用 ItemTouchHandler 实现 ; 如果 RecyclerView 没有添加 ItemTouchHandler , 只能上下滚动 , 左右拉动 , 没有效果 , 也无法进行拖动交换条目操作...从布局中获取 RecyclerView recycler_view = findViewById(R.id.recycler_view); //2 ....只有在此处打开了指定方向的设置 , 才可以应用具体方向的拖动 , 动作有两种 , 一种是滑动 , 如左右侧滑 ; 一种是拖动 , 长按后激活拖动操作 , 可用于拖动交换位置操作 ; 拖动 / 滑动 标志位可以使用...从布局中获取 RecyclerView recycler_view = findViewById(R.id.recycler_view); //2 .

    1.8K10

    FlexibleAdapter

    RecyclerView是Android中展示列表数据的一个非常强大的控件,但在处理复杂列表,尤其是需要支持不同类型的视图、拖拽、排序等操作时,RecyclerView的实现就变得比较复杂。...你只需要在你的build.gradle文件中添加以下依赖: 1 implementation 'eu.davidea:flexible-adapter:5.0.0' 确保你的项目已经配置了合适的minSdkVersion...使用 FlexibleAdapter的使用比起传统的RecyclerView要简单许多。以下是一个基本的使用示例: 定义数据模型 和传统的RecyclerView一样,你需要定义一个数据模型。...你可以轻松地在RecyclerView中实现选择操作,并对选择的项进行相应的操作。...如果你在开发中需要使用RecyclerView,并且想要一个更方便、灵活的解决方案,FlexibleAdapter无疑是一个非常值得尝试的工具。

    6710

    【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 )

    ( 绑定 RecyclerView ) 分析了 ItemTouchHelper 添加时 , 调用了 mItemTouchHelper.attachToRecyclerView(recycler_view...mOnItemTouchListener , 这是 RecyclerView 的 ItemTouchHelper 的核心 ; OnItemTouchListener 是 RecyclerView 中定义的作用与条目组件的触摸监听器..., 只负责拦截手指按下 和 抬起 操作 , 在 ItemTouchHelper 的业务逻辑中 , 不需要处理移动事件 ; 2、处理按下事件 当检测到 MotionEvent.ACTION_DOWN 按下操作时...RecyclerView 中的一个条目 // 用户按下 RecyclerView 中的某个条目 // findAnimation 方法用于找到按下的条目...中的一个条目 ; // 找到手指按下所在位置的条目的 View 组件 // 查找手指按下的 View 子组件 , 该子组件时 RecyclerView 中的一个条目

    1.8K20

    Material Design 在 Android 中的应用

    因为之前毕设项目趣闻中有用到「Support Design」库中的控件,所以写起来会顺手一点。...在分享时能将每个知识点都有个透彻而又完整的分析,不要追求速度。实话说这次分享确实给我带了不少的收获,相信在下次分享中能够有一个满意的表现。...这些控件被统一放置在support design库中,以供开发中使用。使用这些库的前提是API>=21,当然如果你想在 5.0 一下的设备这些控件的话,需要添加appcompat包进行向下兼容。 ?...项目中列表肯定是少不了的,那么这就不得不提RecyclerView了,强大之处不用多说,感兴趣的话看一下我之前写的博客,对其使用有个简单的介绍:简单粗暴RecyclerView 那如果想实现侧滑删除和长按拖拽的功能怎么办呢...RecyclerView原生就支持这些,只需要继承ItemTouchHelper.Callback的类,并实现它几个抽象方法即可。

    1.3K20

    Android-WItemTouchHelperPlus几行代码搞定仿QQ侧滑

    Item),下面来看一下使用方法....它允许您控制每个ViewHolder都启用了哪些触摸行为,并且在user执行这些操作时也会接收回调 .通俗来说就是我们可以再这个类里面去控制我们想要的触摸效果,也就是侧滑还是拖拽.然后可以得到动作执行中的回调...我们需要继承ItemTouchHelper.Callback来实现自己的逻辑.我先大致的介绍一下具体的使用方法,详情还请自行查资料.请看代码: /** * 实现自己的逻辑 * Created by...recyclerView, RecyclerView.ViewHolder viewHolder) { return makeMovementFlags(0, ItemTouchHelper.START...(recyclerView); 复制代码 下面是我目前发现的系统的ItemTouchHelper的一些弊端和好处: 弊端: 当处于滑动状态的时候不下发点击事件.

    42110
    领券