RecycleView结合ItemTouchHelper实现拖动排序

news/2024/5/17 15:35:12 标签: gitee

最近项目中需要实现对某一类条目进行拖动排序功能,实现技术方案就是利用ItemTouchHelper绑定RecyclerView、ItemTouchHelper.Callback来实现UI更新,并且实现动态控制是否开启拖动功能。其中,ItemTouchHelper是Google在androidx包中添加的,其于RecyclerView配合可以比较容易地实现这个功能。

1、布局文件

a、activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/cf5f5f5">
    <include layout="@layout/title_layout"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/ce5e5e5"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/white">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/custom_order"
            android:textColor="@color/c333333"
            android:textSize="14sp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="12dp"/>
        <ToggleButton
            android:id="@+id/toggleBtn"
            android:layout_width="48dp"
            android:layout_height="28dp"
            android:layout_centerVertical="true"
            android:layout_marginRight="12dp"
            android:background="@drawable/toggle_drawable_selector"
            android:button="@null"
            android:textOff=""
            android:textOn=""
            android:layout_alignParentRight="true"/>
    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/tipLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="20dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/custom_order_tip1"
            android:textColor="@color/c808080"
            android:textSize="12sp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="12dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/custom_order_tip2"
            android:textColor="@color/c808080"
            android:textSize="12sp"
            android:layout_centerVertical="true"
            android:layout_marginRight="12dp"
            android:layout_alignParentRight="true"/>
    </RelativeLayout>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

bRecycleViewlistitem布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp">
    <ImageView
        android:id="@+id/image"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp"
        android:src="@mipmap/icon_bank_others"/>
    <TextView
        android:id="@+id/cardTypeTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="xx借记卡"
        android:textColor="@color/c333333"
        android:textSize="14sp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp"
        android:layout_toRightOf="@id/image"/>
    <TextView
        android:id="@+id/cardNoTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="(8800)"
        android:textColor="@color/c808080"
        android:textSize="14sp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="6dp"
        android:layout_toRightOf="@id/cardTypeTxt"/>
    <ImageView
        android:id="@+id/selectImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:scaleType="center"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@mipmap/sort_line"/>
</RelativeLayout>

2、实现ItemTouchHelper.Callback

private ItemTouchHelper.Callback callback = 
new ItemTouchHelper.Callback() {
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                //首先回调的方法,返回int表示是否监听该方向
                int dragFlag = ItemTouchHelper.DOWN | ItemTouchHelper.UP;//拖拽
                int swipeFlag = 0;//侧滑删除
                return makeMovementFlags(dragFlag, swipeFlag);
            }

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

            }

            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                if (mAdapter != null) {
                    mAdapter.onMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
                }
                return true;
            }

            public void onSelectedChanged(ViewHolder viewHolder, int actionState) {
                if (actionState != 0) {
                    viewHolder.itemView.setAlpha(0.9f);
                }
                super.onSelectedChanged(viewHolder, actionState);
            }

            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setAlpha(1.0f);
                if (mAdapter != null) {
                    mAdapter.notifyDataSetChanged();
                    mSortedList = mAdapter.getSortedDataList();
                    LogUtils.debug(TAG, "callback clearView: " + JSONObject.toJSONString(mSortedList));
                    refreshCardSort(mSortedList);
                }
            }
        };

3、初始化RecycleView,并绑定ItemTouchHelper

 mAdapter = new MyAdapter(mSortedList);
        recyclerView.setAdapter(mAdapter);
        LinearLayoutManager llm = new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(llm);
	
	//这两句是关键,完成RecycleView和ItemTouchHelper的绑定
	ItemTouchHelper helper = new ItemTouchHelper(callback);
	helper.attachToRecyclerView(recyclerView);

4、定义自己的Adapter

private class MyAdapter extends RecyclerView.Adapter<ViewHolder> {
        private List<AccountInfo> mDataList;

        public MyAdapter (List<AccountInfo> dataList) {
            this.mDataList = dataList;
        }

        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.card_order_listitem, parent, false));
        }

        public void onBindViewHolder(ViewHolder holder, final int position) {
            final AccountInfo item = mDataList.get(position);
            if (item != null) {
                holder.tvContentType.setText(getCardNoType(item.getAccountType()));
                holder.tvContentNo.setText(getCardNo(item.getAccountNo()));
            }
        }

        public int getItemCount() {
            return mDataList.size();
        }

        public void onMove(int fromPosition, int toPosition) {
            //对原数据进行移动
            Collections.swap(mDataList, fromPosition, toPosition);
            //通知数据移动
            notifyItemMoved(fromPosition, toPosition);
            LogUtils.debug(TAG, "MyAdapter onMove fromPosition: " + fromPosition + ", toPosition: " + toPosition);
        }

        public List<AccountInfo> getSortedDataList() {
            return this.mDataList;
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContentType;
        public TextView tvContentNo;
        public ViewHolder(View view) {
            super(view);
            this.tvContentType = (TextView)view.findViewById(R.id.cardTypeTxt);
            this.tvContentNo = (TextView)view.findViewById(R.id.cardNoTxt);
        }
    }

其他参数定义:
 private List<AccountInfo> mSortedList;
 private MyAdapter mAdapter;


bean定义如下:
package com.qdone.qrcode.pay.qrcodesdkdemo.model;

/**
 * Time: 2024/1/26
 * Author:
 * Description:
 */
public class AccountInfo {

   private String accountId;

   private String custId;
   private String accountNo;
   private String accountType;

   private String bankName;
   private String displayOrder;
   /**
    * 是否是默认账户,0-普通账户 1-默认账户
    */
   private String defaultFlag;

   @Override
   public String toString() {
      return "AccountInfo{" +
              "accountId='" + accountId + '\'' +
              ", custId='" + custId + '\'' +
              ", accountNo='" + accountNo + '\'' +
              ", accountType='" + accountType + '\'' +
              ", bankName='" + bankName + '\'' +
              ", displayOrder='" + displayOrder + '\'' +
              ", defaultFlag='" + defaultFlag + '\'' +
              '}';
   }

   public String getAccountId() {
      return accountId;
   }

   public void setAccountId(String accountId) {
      this.accountId = accountId;
   }

   public String getCustId() {
      return custId;
   }

   public void setCustId(String custId) {
      this.custId = custId;
   }

   public String getAccountNo() {
      return accountNo;
   }

   public void setAccountNo(String accountNo) {
      this.accountNo = accountNo;
   }

   public String getAccountType() {
      return accountType;
   }

   public void setAccountType(String accountType) {
      this.accountType = accountType;
   }

   public String getBankName() {
      return bankName;
   }

   public void setBankName(String bankName) {
      this.bankName = bankName;
   }

   public String getDisplayOrder() {
      return displayOrder;
   }

   public void setDisplayOrder(String displayOrder) {
      this.displayOrder = displayOrder;
   }

   public String getDefaultFlag() {
      return defaultFlag;
   }

   public void setDefaultFlag(String defaultFlag) {
      this.defaultFlag = defaultFlag;
   }
}


http://www.niftyadmin.cn/n/5387610.html

相关文章

探索分布式强一致性奥秘:Paxos共识算法的精妙之旅

提到分布式算法&#xff0c;就不得不提 Paxos 算法&#xff0c;在过去几十年里&#xff0c;它基本上是分布式共识的代名词&#xff0c;因为当前一批常用的共识算法都是基于它改进的。比如&#xff0c;Fast Paxos 算法、Cheap Paxos、Raft 算法等。 由莱斯利兰伯特&#xff08;L…

数据仓库和数据湖的区别

数据仓库和数据湖是两种不同的数据存储和管理架构&#xff0c;它们有以下区别&#xff1a; 1.数据结构&#xff1a;数据仓库采用结构化的数据模型&#xff0c;通常是规范化的关系型数据库&#xff0c;其中数据以表格形式组织&#xff0c;使用预定义的模式和架构。而数据湖则是…

UE学习笔记-- UE4 相比较 UE5 的 double属性,删除编辑器界面右边的图标。

前言 工作中需要删除掉 double 变量在编辑器右边的小图标。 但是 UE4 和 UE5 的 double 属性编辑器界面不一样。 UE4 UE5 场景 因为有时候需要把这个变量设置为 UPROPERTY(VisibleAnywhere)也就是说他是不可 Edit 的&#xff0c;只是显示出来给使用者看的&#xff0c;比如…

Python | 元组的操作方法总结

如是我闻&#xff1a;Python 中的元组&#xff08;tuple&#xff09;是一个不可变序列&#xff0c;这意味着一旦创建了元组&#xff0c;就不能修改它的元素。尽管不能直接修改元组&#xff0c;但我们仍可以通过各种方式操作和使用元组&#xff0c;包括增加、删除、修改&#xf…

centos 系统盘 放到 win pc 中的异常解决

有一块 2.5 480g sata ssd&#xff0c;之前是笔记本电脑的centos系统盘&#xff0c;后来没用了&#xff0c;打算挂到台式机上当下载盘。台式机pc的主板是华硕 h610m-a。 难点一&#xff1a; 因为台式pc上已经挂了两块3.5 hdd&#xff0c;发现sata的电源线都在3.5hdd附近&#…

[java基础揉碎]封装

封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 比如说我们用遥控器对电视的操作, 我们按电视机的开关键, 其实开关背后是一个复杂的过程,…

JS常见问题

文章目录 如何判断是数组 如何判断是数组 Array.isArray console.log(Array.isArray(arr))instanceof&#xff08;instanceof 运算符用于验证构造函数的 prototype 属性是否出现在对象的原型链中的任意位置&#xff09; console.log(arr1 instanceof Array)constructor&#x…

视频基础学习二——图像深度与格式(RGB与YUV)

文章目录 前言一、图像深度1.什么是图像深度2.图像深度的意义3.常见的图像深度8位16位24位32位 二、图像格式1.RGB格式2.RGB样式2.YUVYUV的来由YUV样式RGB和YUV之间的转换YUV的常见类型 总结 前言 本文的目的是为了梳理音视频基础相关的知识&#xff0c;有很多做流媒体、音视频…