【Android 事件分发】ItemTouchHelper 实现拖动排序(二)

简介: 【Android 事件分发】ItemTouchHelper 实现拖动排序(二)

4、设置拖动排序触发操作


重写 ItemTouchHelper.Callback 的 onMove 方法 , 用户拖动操作定成功后 , 会调用该方法 , 如果拖动判定不成功 , 则不会调用该方法 ;


onMove 方法的 第 2 22 参数 , 是拖动的条目索引 ; 第 3 33 参数 , 是拖动后的的位置条目 ;

可以通过调用 RecyclerView.ViewHolder 的 getAdapterPosition 方法 , 可以获取该条目的索引值 ;



public class Callback extends ItemTouchHelper.Callback {
    /**
     * 监听滑动事件
     * 滑动分 水平 / 垂直 两个方向
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
                          @NonNull RecyclerView.ViewHolder viewHolder,
                          @NonNull RecyclerView.ViewHolder target) {
        // 拖动后交换数据, 该方法中交换 Adapter 中的数据, 并刷新界面
        Log.i(TAG, "触发拖动交换条目");
        mAdapter.changeItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }
}



5、RecyclerView.Adapter 适配器中的交换排序操作


删除数据列表中的元素 , 并调用 notifyItemRemoved 触发删除动画 ;


 

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
        /**
         * 交换条目元素
         * @param srcPosition
         * @param dstPosition
         */
        public void changeItem(int srcPosition, int dstPosition) {
            // 交换集合中两个元素位置
            Collections.swap(names, srcPosition, dstPosition);
            // 刷新界面显示
            notifyItemMoved(srcPosition, dstPosition);
        }
  }






三、完整代码实现



1、主界面


package kim.hsl.recyclerview;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import java.util.ArrayList;
import java.util.Collections;
public class MainActivity extends AppCompatActivity {
    /**
     * 数据源
     */
    private ArrayList<String> names = new ArrayList<String>();
    /**
     * 当前的 RecyclerView 列表
     */
    private RecyclerView recycler_view;
    /**
     * 布局管理器
     */
    private LinearLayoutManager layoutManager;
    /**
     * 适配器
     */
    private Adapter adapter;
    /**
     * 添加拖动处理
     */
    private ItemTouchHelper mItemTouchHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化数据
        initData();
        //1 . 从布局中获取 RecyclerView
        recycler_view = findViewById(R.id.recycler_view);
        //2 . 创建并设置布局管理器
        //创建布局管理器
        layoutManager = new LinearLayoutManager(
                this,
                RecyclerView.VERTICAL,
                false);
        //设置布局管理器
        recycler_view.setLayoutManager(layoutManager);
        // 设置边距
        recycler_view.addItemDecoration(new ItemDecoration());
        //3 . 创建并设置列表适配器
        adapter = new Adapter();
        recycler_view.setAdapter(adapter);
        //4. 添加拖动事件
        Callback callback = new Callback(adapter);
        mItemTouchHelper = new ItemTouchHelper(callback);
        mItemTouchHelper.attachToRecyclerView(recycler_view);
    }
    /**
     * 初始化数据
     */
    private void initData(){
        names.add("宋江");
        names.add("卢俊义");
        names.add("吴用");
        names.add("公孙胜");
        names.add("关胜");
        names.add("林冲");
        names.add("秦明");
        names.add("呼延灼");
        names.add("花荣");
        names.add("柴进");
        names.add("李应");
        names.add("朱仝");
        names.add("鲁智深");
        names.add("武松");
        names.add("董平");
        names.add("张清");
        names.add("杨志");
        names.add("徐宁");
        names.add("索超");
    }
    /**
     * RecyclerView 适配器
     */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
        private RecyclerView mRecyclerView;
        @Override
        public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            this.mRecyclerView = recyclerView;
        }
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity.this)
                    .inflate(R.layout.item_recyclerview, parent, false);
            return new ViewHolder(root_view);
        }
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.text.setText("" + names.get(position));
        }
        @Override
        public int getItemCount() {
            return names.size();
        }
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView text;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                text = itemView.findViewById(R.id.text);
            }
        }
        /**
         * 删除元素调用的方法
         * @param position
         */
        public void deleteItem(int position) {
            names.remove(position);
            notifyItemRemoved(position);
        }
        /**
         * 交换条目元素
         * @param srcPosition
         * @param dstPosition
         */
        public void changeItem(int srcPosition, int dstPosition) {
            // 交换集合中两个元素位置
            Collections.swap(names, srcPosition, dstPosition);
            // 刷新界面显示
            notifyItemMoved(srcPosition, dstPosition);
        }
    }
}



目录
相关文章
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
4月前
|
Android开发
UniApp Android 页面拖动,去掉半圆形阴影
UniApp Android 页面拖动,去掉半圆形阴影
43 0
|
4月前
|
XML Java Android开发
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
66 0
|
8月前
|
XML Android开发 数据格式
Android 了解View的事件分发详解
Android 了解View的事件分发详解
51 0
|
8月前
|
Android开发
Android 中SeekBar拖动条控件的基本用法
Android 中SeekBar拖动条控件的基本用法
101 0
Android 中SeekBar拖动条控件的基本用法
|
8月前
|
Android开发
Android 根据时间的升序或降序把数据列表进行排序
Android 根据时间的升序或降序把数据列表进行排序
91 0
|
8月前
|
Android开发
UniApp Android 页面拖动,去掉半圆形阴影
UniApp Android 页面拖动,去掉半圆形阴影
116 0
|
Android开发 容器
Android实现面包屑效果,支持Fragment联动
Android实现面包屑效果,支持Fragment联动
|
Android开发
Android实现连线题效果
Android实现连线题效果
|
Android开发
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
581 0