Android:RecyclerView自由拖动item

这篇具有很好参考价值的文章主要介绍了Android:RecyclerView自由拖动item。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原生就自带有可拖动item的工具:ItemTouchHelper

看下效果:

可拖动RecyclerView预览效果

接下来我们看如何使用。

1、自定义ItemTouchHelper的callback,用来限制是否可以拖动,以及拖动之后的位置更新:

其中判断条件中的item.isMovable这边是记录该item是否可以拖动,也可以换成其他判断条件比如根据位置判断等。

private static class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {

        private final ItemAdapter itemAdapter;

        public MyItemTouchHelperCallback(ItemAdapter itemAdapter) {
            this.itemAdapter= itemAdapter;
        }

        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView,
                                    @NonNull RecyclerView.ViewHolder viewHolder) {
            int layoutPosition = viewHolder.getLayoutPosition();
            ItemInfo item = ItemAdapter.getItem(layoutPosition);
            if (!item.isMovable()) {
                //不可拖动
                return makeMovementFlags(0, 0);
            }
            //这里表示可以拖动的方向,比如如果不给往上方拖动则去掉ItemTouchHelper.UP
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN
                    | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, dragFlags);
        }

        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView,
                              @NonNull RecyclerView.ViewHolder viewHolderSource,
                              @NonNull RecyclerView.ViewHolder viewHolderTarget) {
            int layoutPosition = viewHolderTarget.getLayoutPosition();
            ItemInfo item = itemAdapter.getItem(layoutPosition);
            if (!item.isMovable()) {
                //不可拖动到这里
                return false;
            }
            itemAdapter.onMove(viewHolderSource.getAdapterPosition(),
                    viewHolderTarget.getAdapterPosition());
            return true;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

        }

    }

2、在适配器提供获取item信息和移动之后更新数据的方法给到这个callback使用:

    public ItemInfo getItem(int position) {
        if (position >= 0 && position < mList.size()) {
            return mList.get(position);
        }
        return null;
    }

    public void onMove(int sourcePosition, int targetPosition) {
        ItemInfo item = mList.get(sourcePosition);
        mList.remove(sourcePosition);
        mList.add(targetPosition, item);
        notifyItemMoved(sourcePosition, targetPosition);
    }

3、使用这个callback类:

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(
                new MyItemTouchHelperCallback(adapter));
    itemTouchHelper.attachToRecyclerView(recyclerView);

就可以了,简简单单,轻轻松松。

另外,需要留意一点,如果你是在onBindViewHolder中有设置点击事件的,在onClickListener里面不要直接使用onBindViewHolder方法传进来的position,因为在item位置移动之后,这个position是不会变的,注册事件监听的时候这个值就跟你的点击事件绑死了,所以需要动态获取这个position:文章来源地址https://www.toymoban.com/news/detail-819008.html

    holder.view.setOnClickListener(v -> {
        int currentPosition = holder.getAdapterPosition();
        ItemInfo info = getItem(currentPosition);
        if (listener != null) {
            listener.onItemClick(currentPosition, info);
        }
    });

到了这里,关于Android:RecyclerView自由拖动item的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android NestedScrollView包裹RecyclerView高度撑满所有item,kotlin

    Android NestedScrollView包裹RecyclerView高度撑满所有item,kotlin 当用NestedScrollView包裹RecyclerView后,   然而设置: 会使得RecyclerView加载完成所有itemCount的数理,撑满整个RecyclerView高度,这深深改变了RecyclerView只加载显示当前屏幕可见区域的特性,此时RecyclerView一次性加载全部item。

    2024年02月16日
    浏览(48)
  • Android中实现RecyclerView,并对item及其多个子控件的点击事件监听

    目录 背景 实现RecyclerView 第一步、 新建item的xml 第二步、在activity的布局中引入 RecyclerView 第三步、新建一个adapter   第四步、在activity中初始化绑定adapter即可 实现item及其多个子组件点击事件监听 第一步、 适配器中创建监听对象 第二步、适配器中绑定监听item和子组件 第三

    2024年02月19日
    浏览(54)
  • 【Android】RecyclerView实现列表中的Item之间设置间距的一种方式

    RecyclerView 的 Item 默认没有间距是因为 RecyclerView 是一个高度自定义的控件,它的目标是提供一个高效灵活的列表展示,并且适应各种不同的布局需求。 为了让开发者能够充分自定义列表项的布局和样式,RecyclerView 没有默认设置项来添加 item 之间的间距。这样设计的好处是,

    2024年02月13日
    浏览(53)
  • 解决Android中使用RecyclerView滑动时底部item显示不全的问题

    感觉这个bug是不是因人而异啊,找了很多文章都没能解决我的问题,包括在RecyclerView上在嵌套上一层RelativeLayout,添加属性android:descendantFocusability=”blocksDescendants”,使用ConstraintLayout布局包裹RecyclerView,再设置layout_height=\\\"0dp\\\"和layout_constraintBottom_toBottomOf=\\\"parent\\\"(就是指定约束

    2024年02月16日
    浏览(42)
  • Android RecyclerView实现选中Item变色的最精简高效实现(绝不会出现点击时其它item偶尔也被选中现象)

    效果:  核心代码如下: 代码超精简,试一下您就知道了。跟网上其它的教程不同,绝不会出现点击时其它item偶尔也被同步选中改变颜色导致乱串的现象

    2024年02月11日
    浏览(40)
  • Android Glide in RecyclerView,only load visible item when page return,Kotlin

    base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客-CSDN博客 【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用

    2024年02月09日
    浏览(45)
  • Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin

    build.gradle文件: 如果手机图片很多,假设已经将全部图片装入宫格的列表,在快速上下滑动过程中,由于glide会累积每一个图片的加载任务,如果图片比较大,上下滑动时间又很长,那么累积任务会很严重,导致异常发生,实现在RecyclerView切入后台(或不可见)时候,然后再

    2024年02月10日
    浏览(49)
  • Android开发—RecyclerView使用

    RecyclerView 在Android中用于创建列表。 官网的解释为: RecyclerView 可以让您轻松高效地显示大量数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。 当RecyclerView的列表项滚出屏幕的时候,RecyclerView不会销毁该视图,相反而是将这些视图复用到

    2024年02月16日
    浏览(73)
  • Android RecyclerView使用简述

      RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。 文章的功能可以先运行看看效果,APK下载   对于RecyclerView的使用根据实际项目进

    2023年04月08日
    浏览(88)
  • Android RecyclerView 实现瀑布流

    Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等 瀑布流也是个常用的显示控件了,但是在使用时经常遇到一些问题,比如滑动回顶部后出现空隙、item在滑动时乱跳等问题。 下面就来说说我怎么实现的瀑布流,并且怎么处理上面所说的这些问题的。 我使用了原生

    2024年02月09日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包