首页 > 其他分享 >android-RecyclerView实现拖动排序

android-RecyclerView实现拖动排序

时间:2023-04-10 14:13:58浏览次数:47  
标签:ViewHolder 拖动 int viewHolder ItemTouchHelper android RecyclerView public

android: RecyclerView实现拖动排序

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

1. 布局文件

activity_main.xml

<?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.support.v7.widget.RecyclerView 
        android:id="@+id/rv_health_habit" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" />
</LinearLayout>

RecyclerView的Item的布局item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"          
        android:layout_width="match_parent"    
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:background="@color/white">

    <LinearLayout android:orientation="horizontal"  
        android:layout_width="match_parent" 
        android:layout_height="60dp">

        <RelativeLayout 
            android:layout_width="match_parent"   
            android:layout_height="match_parent"  
            android:layout_marginLeft="16dp">

            <TextView
                android:id="@+id/tv_content"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content" 
                android:layout_centerVertical="true"
                android:textSize="18dp"   
                android:textColor="@color/black" />

            <ImageView 
                android:layout_width="wrap_content"       
                android:layout_height="wrap_content"   
                android:layout_marginRight="16dp"     
                android:layout_alignParentRight="true"   
                android:layout_centerVertical="true"
                android:src="@drawable/ic_location"  />
        </RelativeLayout>
    </LinearLayout>  
</LinearLayout>

2. 实现ItemTouchHelper.Callback

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

        public boolean onMove(RecyclerView recyclerView, ViewHolder viewHolder, android.support.v7.widget.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, android.support.v7.widget.RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setAlpha(1.0f);
                if (mAdapter != null) {
                    mAdapter.notifyDataSetChanged();
                    mSortedList = mAdapter.getSortedDataList();
                }
            }
        };

3.RecyclerView绑定ItemTouchHelper

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

4.定义自己的Adapter

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

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

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

        public void onBindViewHolder(ViewHolder holder, final int position) {
            final dataItem item= mDataList.get(position);
            if (item != null) {
                holder.tvContent.setText(item.name);
            }
        }

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

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

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;
        public ViewHolder(View view) {
            super(view);
            this.tvContent = (TextView)view.findViewById(R.id.tv_content);
        }
    }

参考链接

RecyclerView实现拖动排序

标签:ViewHolder,拖动,int,viewHolder,ItemTouchHelper,android,RecyclerView,public
From: https://www.cnblogs.com/yongdaimi/p/17302720.html

相关文章

  • XP Android7.0+ 整合包
    下载链接代码如下:点击查看代码adbremountadbpush命令adbpush路径/systemadbshellsucd/systemmount-oremount-w/systemshscript.sh//出现Done表示成功了......
  • Android设备网络压力测试
     网络测试的几个维度:1.网络的性能带宽:通过TCP测试来量度时延:用ping命令量度数据报丢失:用IperfUDP测试来量度Jitter(延时变化):用IperfUDP测试来量度信号强度(WIFI下):使用NetworkSignalInfo可以查看 2.网络的稳定性可以在连续的测试......
  • 一统天下 flutter - 插件: flutter 与 android 原生之间的数据通信
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-插件:flutter与android原生之间的数据通信示例如下:lib\plugin\plugin.dart/**插件*本例用于演示flutter与android/ios原生之间的数据通信**一、android插件......
  • Android 数据库
    activity_main.xml<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"......
  • 【 2023 】近期一些编译调试开发 Android7&9 系统的笔记( h616 / imx8m / rk3399 )
    主要就记录一下自己食用过程中遇到的一些问题吧,板子有新有旧,但都差不多。待整理呢。https://stackoverflow.com/questions/67363030/rebuild-android-code-with-error-ssl-error-when-connecting-to-the-jack-server-thttps://note.qidong.name/2017/07/disable-jack-server/......
  • Android LiveData Transformations怎么使用
    AndroidLiveDataTransformations是LiveData库中的一个类,它提供了一些便捷的方法来转换LiveData的数据。使用LiveDataTransformations需要在项目的build.gradle文件中添加以下依赖项: implementation'androidx.lifecycle:lifecycle-extensions:2.2.0'接下来可以在Vi......
  • Android 启用 Material Design 3(Material You) 小白教程
    介绍md3的效果:原本是红色壁纸对应的红色App主题,在改成绿色壁纸之后,App主题也相应的变成绿色了。这个效果主要是使用了MaterialYou中的动态颜色功能。官方文档https://m3.material.io具体每个组件的代码示例,在github上:https://github.com/material-components/materia......
  • 解决Flutter_Boost,在Android Studio 出现“Cannot resolve symbol” 的问题
    今天在调试的时候,Android Studio报了一个莫名其妙的错误Cannot resolve symbol'R'让人不知所措,怎么会出现 Cannot resolve symbol 这种错误呢?下面给大家分享Android Studio 出现“Cannot resolve symbol”解决方案,需要的朋友可以参考下一:AndroidStudio无法识别同......
  • Android学习笔记(五十):声明、请求和检查许可
    基于安全需求,应用对Android系统提供的contentprovider或者service的访问需要在安装时进行许可,这就是AndroidManifest.xml文件中的permission中声称,之前已经很多例子。同样如果其他应用要访问我们的数据,我们也可以要求这些应用必须获得用户授权方可访问我们的数据。申请授权:请求per......
  • VisionMobile:移动平台生态系统冲突报告(八)Chapter C:Android(下)
    开发者的采纳2011年10月,AndroidMarket有30万应用,紧随Apple,是第二大的平台应用商店。功能丰富和易于学习的应用架构,强大的SDK,结合不断增长的手机数量,使大量开发者从PC领域和移动领域(Symbian,J2ME,WindowsMobile,和PalmOS)进入Android。在我们2011年开发者经济学研究中,Android名列开发......