Android Item拖动顺序

2020-08-11  本文已影响0人  我家猫猫不睡觉
public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {

/**
     * Callback回调监听时先调用的,用来判断当前是什么动作,比如判断方向
     * 作用:哪个方向的拖动
     */
      @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //方向:up,down,left,right
        //常量
        // ItemTouchHelper.UP    0x0001
        // ItemTouchHelper.DOWN  0x0010
        // ItemTouchHelper.LEFT
        // ItemTouchHelper.RIGHT

        int dragFlags = 0;
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
                    ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        } else {
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        }
        // 支持左右滑动(删除)操作, swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END
        final int swipeFlags = 0;

        int flags = makeMovementFlags(dragFlags, swipeFlags);

        return flags;
    }

     /**
     * 是否打开长按拖拽效果
     */

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

     //当上下移动的时候回调的方法
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        //被按下拖拽时候的position
        int fromPosition = viewHolder.getAdapterPosition();
        //当前拖拽到的item的posiiton
        int toPosition = target.getAdapterPosition();

        //回调到adapter 当中处理移动过程中,数据变更的逻辑,以及更新UI
        if (recyclerView.getAdapter() instanceof ItemTouchMoveListener) {
            ItemTouchMoveListener listener = ((ItemTouchMoveListener) recyclerView.getAdapter());
            listener.onItemMove(fromPosition, toPosition);
        }
        return true;
    }

    //侧滑的时候回调的方法
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

    }

    //设置滑动item的背景
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
        //判断选中状态
        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            if (viewHolder instanceof OnItemDragListener) {
                OnItemDragListener itemViewHolder = (OnItemDragListener) viewHolder;
                itemViewHolder.onItemSelected(viewHolder.getAdapterPosition());
            }
        }
        super.onSelectedChanged(viewHolder, actionState);
    }

    //清除滑动item的背景
    @Override
    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        // 恢复
        if (viewHolder instanceof OnItemDragListener) {
            OnItemDragListener itemViewHolder = (OnItemDragListener) viewHolder;
            itemViewHolder.onItemFinish(viewHolder.getAdapterPosition());
        }
        super.clearView(recyclerView, viewHolder);
    }
}

public class PayManageAdapter extends RecyclerView.Adapter<PayManageAdapter.IndexViewHolder>
        implements ItemTouchMoveListener {

    private Context mContext;
    private List<TestBean> mList = new ArrayList<>();
    private int mFromPosition;
    private int mToPosition;

    public PayManageAdapter(Context context) {
        this.mContext = context;
    }

    public void setData(List<TestBean> list) {
        if (this.mList.size() > 0) {
            this.mList.clear();
        }
        mList.addAll(list);
        notifyDataSetChanged();
    }

    private TouchMovedCallBack mTouchMovedCallBack;

    public void setTouchMovedCallBack(TouchMovedCallBack touchMovedCallBack) {
        this.mTouchMovedCallBack = touchMovedCallBack;
    }

     @NonNull
    @Override
    public IndexViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pay_sort, parent, false);
        return new IndexViewHolder(view);
    }

     @Override
    public void onBindViewHolder(@NonNull IndexViewHolder holder, int position) {
        TestBean bean = mList.get(position);
        //业务逻辑
    }

      @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }

    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        //1.数据交换 2.刷新
        TestBean bean = mList.get(fromPosition);
        mList.remove(fromPosition);
        mList.add(toPosition, bean);
        notifyItemMoved(fromPosition, toPosition);
        return true;
    }

      class IndexViewHolder extends RecyclerView.ViewHolder implements OnItemDragListener {
      
        private TextView textView;

        public IndexViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_title);

        }

         @Override
        public void onItemSelected(int fromPosition) {
            mFromPosition = fromPosition;
            itemView.setBackgroundColor(mContext.getResources().getColor(R.color.color_65AAFC));
        }

         @Override
        public void onItemFinish(int toPosition) {
            mToPosition = toPosition;
            itemView.setBackgroundColor(mContext.getResources().getColor(R.color.colorWhile));
            //传递选中position 和 放下时的position 
            mTouchMovedCallBack.callBackNewItems(mFromPosition, mToPosition, mList);
        }
    }
}


// 接口

public interface ItemTouchMoveListener {
    /**
     * 当拖拽的时候回调
     * 可以在方法里面实现:拖拽条目并实现刷新效果
     * @param fromPosition 从什么位置拖
     * @param toPosition 到什么位置
     * @return 是否执行了move
     */
    boolean onItemMove(int fromPosition,int toPosition);
}


/**
 * ViewHolder 被选中 以及 拖拽释放 触发监听器
 */
public interface OnItemDragListener {
    /**
     * Item被选中时触发
     */
    void onItemSelected(int fromPosition);

    /**
     * Item在拖拽结束/滑动结束后触发
     */
    void onItemFinish(int toPosition);
}


/**
 * 顺序移动后返回新的集合及position 用于判断集合是否移动过
 */
public interface TouchMovedCallBack {
    void callBackNewItems(int fromPosition, int toPosition,List<TestBean> list);
}

*activity中使用, 实现TouchMovedCallBack接口

       mRecyclerView = findViewById(R.id.recycle_view);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(manager);
        mAdapter = new PayManageAdapter(this);
        //条目触摸帮助类
        ItemTouchHelper.Callback callback = new MyItemTouchHelperCallback();
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(mRecyclerView);
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setData(items);

  /**
     * 移动结束 回调方法
     * @param fromPosition item 移动前位置
     * @param toPosition   item 移动后位置
     * @param list
     */
    @Override
    public void callBackNewItems(int fromPosition, int toPosition, List<TestBean> list) {
        LogUtil.e("TestActivity", "fromPosition:" + fromPosition);
        LogUtil.e("TestActivity", "toPosition:" + toPosition);
        if (fromPosition != toPosition) {
           //业务逻辑
        }
    }

上一篇 下一篇

猜你喜欢

热点阅读