当前位置: 首页 > article >正文

Android之RecyclerView列表拖动排序

文章目录

  • 前言
  • 一、效果图
  • 二、实现步骤
    • 1.xml布局
    • 2.activity代码
    • 3.adapter
  • 总结


前言

随着需求的变化,很多地方需要加拖动改变顺序的需求,用RecyclerView就可以实现列表拖动排序,列如像朋友圈图片拖动排序,或者音乐播放器列表拖动排序,我这里没有弄GIF图,截图就是正在拖动的效果。


一、效果图

在这里插入图片描述
在这里插入图片描述

二、实现步骤

1.xml布局

代码如下(示例):

 	 <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="12dp"
        android:overScrollMode="never" />

2.activity代码

代码如下(示例):

	private lateinit var list_view: RecyclerView
	private lateinit var listbean: MutableList<String>
	private lateinit var adapter: IntelligentReplyAdapter
	//一排显示多个需要全局定义,不然每次排序后都要加载一次空隙就越来越大,正常列表显示一个不需要定义这个
	private lateinit var itemDecoration: RecyclerView.ItemDecoration

	    itemDecoration = SpacesItemDecoration(20)
		listbean = mutableListOf()
		for (i in 1..6) {
            listbean.add("$i 号回复组名称")
        }
 		list_view = findViewById(R.id.list_view)
        list_view.layoutManager = LinearLayoutManager(
            this,
            LinearLayoutManager.VERTICAL,
            false
        ) //竖向显示
         // 设置LayoutManager为GridLayoutManager,每行3个item -->一排显示多个需要
        //val layoutManager = GridLayoutManager(this, 3)
        //list_view.addItemDecoration(itemDecoration)
        //list_view.layoutManager = layoutManager
        adapter = IntelligentReplyAdapter(listbean, this)
        list_view.adapter = adapter
        //RecyclerView实现拖拽实现 设置ItemTouchHelper
        val callback: ItemTouchHelper.Callback = object : ItemTouchHelper.Callback() {
            override fun getMovementFlags(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder
            ): Int {
                val dragFlags =
                    ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
                return makeMovementFlags(dragFlags, 0) // 允许上下左右拖拽
            }

            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                val toPositioncc = viewHolder.adapterPosition
                // 检查目标位置是否是最后一个位置
                if (toPositioncc == (adapter.itemCount - 1)) {
                    return false // 不允许移动到最后一个位置
                }
                val toPosition = viewHolder.adapterPosition
                val fromPosition = target.adapterPosition
                // 交换数据集中的元素位置
                Collections.swap(listbean, fromPosition, toPosition)
                // 通知Adapter数据已更改
                adapter.notifyItemMoved(fromPosition, toPosition)
                return true
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                // 不处理滑动事件,如果需要可以处理删除逻辑
            }
        }
        val itemTouchHelper = ItemTouchHelper(callback)
        itemTouchHelper.attachToRecyclerView(list_view)

3.adapter

代码如下(item的xml布局就补贴了):

/**
 * 作者:CaoLiulang
 * ❤
 * Date:2024/12/24
 * ❤
 * 模块 智能回复adapter
 */
public class IntelligentReplyAdapter extends RecyclerView.Adapter<IntelligentReplyAdapter.ViewHolder> {
    private List<String> list;
    private Context context;


    public IntelligentReplyAdapter(List<String> list, Context context) {
        this.list = list;
        this.context = context;
    }

    /**
     * 加载更多
     *
     * @param mPageList
     */
    public void setData(List<String> mPageList) {
        try {
            if (mPageList != null) {
                int previousSize = 0;
                try {
                    previousSize = list.size();
                } catch (Exception e) {
                    previousSize = 0;
                }
                int sizez = previousSize + 2;
                list.addAll(mPageList);
                notifyItemRangeInserted(sizez, mPageList.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.intelligentreply_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    /**
     * 类似GetView
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(final ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        holder.text_name.setText(list.get(position));
    }

    //添加元素,需要告诉UI线程布局的变动
    public void update() {
        notifyDataSetChanged();
    }

    /**
     * 长度
     *
     * @return
     */
    @Override
    public int getItemCount() {
        return list.size();
    }

    /**
     * 初始化组件
     */
    class ViewHolder extends RecyclerView.ViewHolder {

        TextView text_name;
        public ViewHolder(final View itemView) {
            super(itemView);
            text_name = itemView.findViewById(R.id.text_name);
        }
    }

总结

实现列表拖拽排序其实很简单,RecyclerView正常加载数据,然后去设置ItemTouchHelper就可以了,是不是很简单呢。


http://www.kler.cn/a/590490.html

相关文章:

  • Vue3项目白屏问题深度解析:从AI辅助诊断到性能优化实战
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(49)万鸦壶焚网络 - 网络延迟时间(Bellman-Ford)
  • Spring boot+mybatis的批量删除
  • 【AI】深度学习与人工智能应用案例详解
  • LIMS系统在纸制品制造的应用 内检实验室LIMS系统提升纸制品质控
  • Postman发送GET请求示例及注意事项
  • Vue.js 事件处理与修饰符详解
  • 2. qt写带有槽的登录界面(c++)
  • 玩转python:通俗易懂掌握高级数据结构-collections模块之UserDict
  • 人工智能之数学基础:从线性变换理解矩阵范数和矩阵行列式
  • 第一中标人!晶科能源入围大唐集团19.5GW光伏组件集采
  • 遥感新态势:Sentinel - 2多光谱指数与AI深度融合
  • 卡内基梅隆大学研究人员推出 PAPRIKA:一种微调方法,使语言模型能够发展出不局限于特定环境的通用决策能力
  • 基于javaweb的SpringBoot博客商城管理系统设计与实现(源码+文档+部署讲解)
  • 通过 Python 爬虫提高股票选股胜率
  • Linux快速安装mysql
  • 3D 射线方程学习
  • 青少年编程与数学 02-010 C++程序设计基础 43课题、MFC
  • 鸿蒙应用开发--数据埋点的名称由来,发展脉络,典型场景,现代演进的无埋点和智能化埋点//学习时长数据埋点的实现--待更新
  • DNS查询