RecyclerVIew拖拽实现

这里直接上代码,相信注释已经写的很清楚了:


public class MainActivity extends AppCompatActivity {

    /**
     * recyclerview适配器
     */
    private DragRecyclerViewAdapteer adapter;
    /**
     * 数据源
     */
    private List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //为了测试这里直接简单的初始化数据
        list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list.add("this is " + i);
        }

        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager
                .VERTICAL, false);
        adapter = new DragRecyclerViewAdapteer(list, this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);
        //这是实现拖拽的关键,自定义一个回调类继承ItemTouchHelperl.CallBack类
        //实现三个抽象方法 getMovementFlags、onMove、onSwiped,具体功能在MyCallBack类中讲解
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyCallBack());
        itemTouchHelper.attachToRecyclerView(recyclerView);

    }

    public class MyCallBack extends ItemTouchHelper.Callback {


        /**
         * 解释下这里的滑动方向,举个例子:一个竖向的列表,我想实现item左滑删除,就需要设置这个滑动方向了
         * 如果不需要设置滑动则可以设置swapeFlag=0
         * 因为GridLayoutManager上下左右都可以拖拽 所以他的滑动方向swapeFlag是需要设置为0的
         *
         * @param recyclerView
         * @param viewHolder
         * @return
         */
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            //判断recyclerview的layoutManager的类型,根据不同的类型设置不同的滑动方向和拖拽方向
            if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
                //拖拽方向
                int dragFlag;
                //滑动方向
                int swapeFlag;
                //得到linearLayoutManager的列表方向
                int orientation = ((LinearLayoutManager) recyclerView.getLayoutManager())
                        .getOrientation();
                //如果列表方向是竖向的
                if (orientation == LinearLayoutManager.VERTICAL) {
                    //拖拽方向设置为上或者下
                    dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                    //滑动方向设置为左或者右
                    swapeFlag = 0;
                } else {
                    //拖拽方向设置为左或者右
                    dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                    //滑动方向设置为上或者下
                    swapeFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                }
                //最后通过makeMovementFlags返回拖拽和滑动方向
                return makeMovementFlags(dragFlag, swapeFlag);
            } else {
                //因为gridLayoutManager上下左右都可以拖拽,所以设置拖拽方向为四种,滑动方向为0
                int dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT |
                        ItemTouchHelper.RIGHT;
                int swapeFlag = 0;
                return makeMovementFlags(dragFlag, swapeFlag);
            }
        }

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 
                              RecyclerView.ViewHolder target) {
            //得到需要拖拽item的位置
            int fromPosition = viewHolder.getAdapterPosition();
            //得到item拖拽到目标的位置
            int toPosition = target.getAdapterPosition();
            if (fromPosition > toPosition) {
                //如果是从下往上拖拽的就依次将需要拖拽的item的位置和目标的位置(拖拽item的位置-1)交换
                for (int i = fromPosition; i > toPosition; i--) {
                    Collections.swap(list, i, i - 1);
                }

            } else {
                //如果是从上往下拖拽的就依次将需要拖拽的item的位置和目标的位置(拖拽item的位置+1)交换
                for (int i = fromPosition; i < toPosition; i++) {
                    Collections.swap(list, i, i + 1);
                }
            }
            //最后通过适配器将item移动
            adapter.notifyItemMoved(fromPosition, toPosition);
            return true;
        }

        /**
         * 滑动后的回调方法,
         * 这里只讲解如何拖拽 ,删除可以自行判断
         * @param viewHolder
         * @param direction
         */
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值