Android studio RecycleView的长按拖拽事件 Java实现 和kotlin实现

之前有写过这个adapter,对于item有点简单的的变化,并且加了长按拖拽事件

  • 效果图

在这里插入图片描述

  • 长按拖拽后

在这里插入图片描述

主要代码

 ItemTouchHelper.Callback callback=new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                //监控上下左右
                int swipFlag = 0;//ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
                int dragflag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                return makeMovementFlags(dragflag,swipFlag);
            }
            //移动的处理
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                recyclerAdapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
                Collections.swap(personList,viewHolder.getAdapterPosition(),target.getAdapterPosition());
                return true;
            }
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                //主要是做左右拖动的回调
            }
            @Override
            public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
                //当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
                return true;
            }
            @Override
            public boolean isLongPressDragEnabled() {  
                //是否开启长按拖动
                //返回true  可以实现长按拖动排序和拖动动画
                return true;
            }
        };
}

适配器

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private List<Person> PersonList;

    public RecyclerAdapter(List<Person> PersonList)
    {
        this.PersonList = PersonList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) {
        holder.id.setText(String.valueOf(PersonList.get(position).getId()));
        holder.name.setText(PersonList.get(position).getName());
        holder.action.setText(PersonList.get(position).getAction());
    }

    @Override
    public int getItemCount() {
        return PersonList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView id;
        TextView name;
        TextView action;

        public ViewHolder(@NonNull View itemView)
        {
            super(itemView);
            this.id= itemView.findViewById(R.id.tv_id);
            this.name= itemView.findViewById(R.id.tv_name);
            this.action= itemView.findViewById(R.id.tv_action);
        }

    }
}
  • item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:orientation="horizontal"
    android:weightSum="3">
    <TextView
        android:layout_marginStart="50dp"
        android:id="@+id/tv_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="1" />
    <TextView
        android:id="@+id/tv_name"
        android:layout_marginStart="120dp"
        android:layout_toEndOf="@+id/tv_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="admin" />
    <TextView
        android:layout_alignParentRight="true"
        android:layout_marginEnd="50dp"
        android:id="@+id/tv_action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="敲代码" />
    <View
        android:layout_below="@+id/tv_name"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="2dp"/>
</RelativeLayout>
  • MainActivity
public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyclerAdapter recyclerAdapter;
    private List<Person> personList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
        //点击长按滑动
        onclick();

    }
    //点击长按滑动
    private void onclick() {
        ItemTouchHelper.Callback callback=new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                //监控上下左右
                int swipFlag = 0;//ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
                int dragflag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                return makeMovementFlags(dragflag,swipFlag);
            }

            //移动的处理
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                recyclerAdapter.notifyItemMoved(viewHolder.getAdapterPosition(),target.getAdapterPosition());
                Collections.swap(personList,viewHolder.getAdapterPosition(),target.getAdapterPosition());
                return true;
            }
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                //主要是做左右拖动的回调
            }
            @Override
            public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
                //当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
                return true;
            }
            @Override
            public boolean isLongPressDragEnabled() {
                //是否开启长按拖动
                //返回true  可以实现长按拖动排序和拖动动画
                return true;
            }
        };
        //创建item helper
        ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback);
        //绑定到recyclerView上面
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

    //添加数据
    private void initData() {
        personList=new ArrayList<>();
        personList.add(new Person(1,"anmin","敲代码"));
        personList.add(new Person(2,"张三","出差"));
        personList.add(new Person(3,"join","吃饭"));
        personList.add(new Person(4,"李四","睡觉"));
        personList.add(new Person(5,"jack","打豆豆"));
    }
    //初始化
    private void initView(){
        recyclerView = findViewById(R.id.recycleview);
        // 线性布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        //适配器
        recyclerAdapter = new RecyclerAdapter(personList);
        recyclerView.setAdapter(recyclerAdapter);
    }
}
  • activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EEEEEE"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="3">

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="序号" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="名字" />

        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="动作" />
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
  • 以上是整个代码过程

以下是kotlin写法:

 val callback: Callback = object : Callback() {
            override fun getMovementFlags(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder
            ): Int {
                //监控上下左右
                val swipFlag = 0 //ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
                val dragflag = ItemTouchHelper.UP or ItemTouchHelper.DOWN
                return makeMovementFlags(dragflag, swipFlag)
            }
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                addtargetadapter?.notifyItemMoved(
                    viewHolder.adapterPosition,
                    target.adapterPosition
                )
                Collections.swap(addlist, viewHolder.adapterPosition, target.adapterPosition)
                return true
            }
            override fun canDropOver(
                recyclerView: RecyclerView,
                current: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean { //当前item可以被拖动到目标位置后,直接落到target上,后面的item也接着落
                return true
            }
            override fun isLongPressDragEnabled(): Boolean { //返回true  可以实现长按拖动排序和拖动动画
                return true
            }
            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { //主要是做左右拖动的回调
            }
        }
        //创建item helper
        val itemTouchHelper = ItemTouchHelper(callback)
        //绑定到recyclerView上面
        itemTouchHelper.attachToRecyclerView(recycleview)
    }

结束

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AaVictory.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值