当前位置: 代码网 > it编程>App开发>Android > Android RecyclerView自由拖动item的实现代码

Android RecyclerView自由拖动item的实现代码

2024年05月18日 Android 我要评论
原生就自带有可拖动item的工具:itemtouchhelper看下效果:接下来我们看如何使用。1、自定义itemtouchhelper的callback,用来限制是否可以拖动,以及拖动之后的位置更新

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

看下效果:

接下来我们看如何使用。

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:

    holder.view.setonclicklistener(v -> {
        int currentposition = holder.getadapterposition();
        iteminfo info = getitem(currentposition);
        if (listener != null) {
            listener.onitemclick(currentposition, info);
        }
    });

到此这篇关于android recyclerview自由拖动item的文章就介绍到这了,更多相关android recyclerview拖动item内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com