notifyItemMoved实现recyclerView拖拽动画

RecyclerView实现拖拽切换item位置,包括linearlayoutManager,GridLayoutManager两种效果都能实现。
  
本文链接:https://blog.csdn.net/u011932309/article/details/104893667/

在这里插入图片描述

代码很简单,直接上码 

public class MainActivity extends AppCompatActivity {


    private RecyclerView recyclerView ;
    private List<String> list ;

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

    }


    private void initView() {
        recyclerView = findViewById(R.id.mRecyclerView);
        GridLayoutManager gridLayoutManager=new GridLayoutManager(this,3) ;
        recyclerView.setLayoutManager(gridLayoutManager);
    }

    private void initData() {
        list = new ArrayList<>() ;
        list.add("空但");
        list.add("卡达菲");
        list.add("独守空房");
        list.add("卡萨丁");
        list.add("卢卡斯的");
        list.add("喀什");

        recyclerView.setAdapter(myAdapter = new MyAdapter(list));
        mItemTouchHelper = new ItemTouchHelper(new MyItemTouchHelper());
        mItemTouchHelper.attachToRecyclerView(recyclerView);
    }


    private MyAdapter myAdapter ;
    private ItemTouchHelper  mItemTouchHelper;


    public class MyItemTouchHelper extends ItemTouchHelper.Callback{


        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
                final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                final int swipeFlags = 0;
                return makeMovementFlags(dragFlags, swipeFlags);
            } else {
                final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                final int swipeFlags = 0;
                return makeMovementFlags(dragFlags, swipeFlags);
            }
        }

        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            //得到当拖拽的viewHolder的Position
            int fromPosition = viewHolder.getAdapterPosition();
            //拿到当前拖拽到的item的viewHolder
            int toPosition = target.getAdapterPosition();
            if (fromPosition < toPosition) {
                for (int i = fromPosition; i < toPosition; i++) {
                    Collections.swap(list, i, i + 1);
                }
            } else {
                for (int i = fromPosition; i > toPosition; i--) {
                    Collections.swap(list, i, i - 1);
                }
            }
            myAdapter.notifyItemMoved(fromPosition, toPosition);
            return true;
        }

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

        }


        /**
         * 长按选中Item的时候开始调用
         *
         * @param viewHolder
         * @param actionState
         */
        @Override
        public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
            if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
                viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
            }
            super.onSelectedChanged(viewHolder, actionState);
        }

        /**
         * 手指松开的时候还原
         * @param recyclerView
         * @param viewHolder
         */
        @Override
        public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            super.clearView(recyclerView, viewHolder);
            viewHolder.itemView.setBackgroundColor(getColor(R.color.colorPrimary));
        }

        /**
         * 重写拖拽不可用
         * @return
         */
        @Override
        public boolean isLongPressDragEnabled() {
            return true;
        }


    }

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
        List<String> list ;
        public MyAdapter (List<String> list){
            this.list = list ;
        }
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_view_layout,parent,false));
        }

        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.tv_content.setText(list.get(position));

            holder.tv_content.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    MainActivity.this.startActivity(new Intent(MainActivity.this,VideoNomarlActivity.class));
                }
            });
        }

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

        public class MyViewHolder extends RecyclerView.ViewHolder{

            public TextView tv_content ;
            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                tv_content = itemView.findViewById(R.id.tv_content);
            }
        }
    }
}
 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现两个RecyclerView之间的item互相拖拽可以通过以下步骤进行: 1. 首先,在布局文件中分别添加两个RecyclerView控件。给它们分别设置不同的ID,方便后续代码操作。 2. 在代码中分别找到两个RecyclerView实例,并为它们设置LayoutManager和Adapter。确保两个RecyclerView显示的数据不同。 3. 为每个RecyclerViewItem添加拖拽功能,可以使用ItemTouchHelper类来实现。创建一个ItemTouchHelper实例,并将其附加到两个RecyclerView上。 4. 实现ItemTouchHelper.Callback类,重写以下几个方法: - getMovementFlags:指定拖拽和滑动的方向,可以使用ItemTouchHelper.UP、ItemTouchHelper.DOWN、ItemTouchHelper.LEFT、ItemTouchHelper.RIGHT等常量。 - onMove:处理拖拽事件,通过交换两个Item的位置实现互相拖拽。 - onSwiped:处理滑动事件,可以在这个方法中实现删除Item的操作。 5. 在RecyclerView的Adapter中对Item的触摸事件进行监听,当用户按下item时,调用startDrag方法来开始拖拽。 6. 当拖拽结束时,将交换过位置的数据更新到对应的数据源中,并刷新RecyclerView。 通过以上步骤,就可以实现两个RecyclerView之间的item互相拖拽了。可以在同一个Activity或Fragment中同时显示这两个RecyclerView,或者在不同的页面中分别显示这两个RecyclerView。这样用户就可以通过拖拽的方式,将一个RecyclerViewitem拖放到另一个RecyclerView中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值