##做便签选择功能,类似熊猫直播的常用频道选择,遇到了Scollerview嵌套Recyclerview无法触发拖拽处理##
* 一开始想着直接用哒神的库直接调用,结果出来发现scollerview嵌套无法拖拽了,上网查了好多都是无解,后来无奈直接自己重写ItemTouchHelperCallback粘性回调处理了
先看下效果图吧
实现思路
1.首先先做个接口
public interface ItemTouchHelperAdapter {
boolean onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}
2.写对应的ItemTouchHelperCallback
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private ItemTouchHelperAdapter adapter;
public ItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
this.adapter = adapter;
}
/**
* 返回true,开启长按拖拽
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
}
/**
* 返回true,开启swipe事件
* @return
*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/**
* getMovementFlags、onMove、onSwiped是必须要实现的三个方法
*
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//适用GridLayoutManager类型和LinearLayoutManager类型。
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
//拖拽的方向。
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
//侧滑的方向:left right。
return makeMovementFlags(dragFlags, swipeFlags);
} else if (layoutManager instanceof LinearLayoutManager) {
//线性方向分为:水平和垂直方向。
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
if (linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {
int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
return makeMovementFlags(dragFlags, swipeFlags);
} else {
//拖拽的方向。
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//侧滑的方向:left right。
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
return makeMovementFlags(0, 0);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
/**
* 回调
*/
adapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
/**
* 回调
*/
adapter.onItemDismiss(viewHolder.getAdapterPosition());
}
}
3.之后就可以写adapter添加自己的回调了(具体看源码吧)
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
mOnItemMoveLin.onItemMoveing(fromPosition,toPosition);
return true;
}
4.在主页面设置helper与recyclerview的关联
ItemTouchHelper.Callback callback = new ItemTouchHelperCallback(mMenuAdapter_new);
helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView(recycler_view_new);
其他就没啥重要的了可以下载源码了看了