如图列表使用RecyclerView实现,现在需求是点击每个item 的三个横线的图标就能进行拖拽,而不用默认的长按进入拖拽的功能,实现的思路大体分几步:
1.实现自定义的ItemTouchHelper,按照一般网上的教程填充代码,但是注意一点就是
@Override public boolean isLongPressDragEnabled() { return false; }这个方法在这里就要返回false了.
2.我们在Adapter里面去写一个接口用于这个三个横线的图标ACTION_DOWN事件的开始的回调
public interface OnRoomDragFlagClickListener { void onRoomDragFlagClick(RecyclerView.ViewHolder holder); } public OnRoomDragFlagClickListener listener; public void setListener(OnRoomDragFlagClickListener listener) { this.listener = listener; }注意回调回来的是ViewHolder!
3.在onCreateViewHolder里面监听这个三个横线图标的触摸事件,一旦手指按下就回调
public RoomZoneListViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { RoomZoneListViewHolder holder = new RoomZoneListViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(layoutId, viewGroup, false)); holder.sortBtn.setOnTouchListener((v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (holder.sortBtn.getVisibility() == View.VISIBLE) { if (listener != null) { listener.onRoomDragFlagClick(holder); } } } return false; }); return holder; }touchListener返回false就行,其实不需要消费事件,只是能感知ACTION_DOWN事件就可以了.
4.在我们回调的地方进行拖拽就行了
mZoneAdapter.setListener(holder -> { mItemHelper.startDrag(holder); });到这里就实现了,点击这个图标就能进行拖拽的功能,而不是一定要长按才能拖拽.