下面列出了怎么用android.support.v7.widget.helper.ItemTouchHelper的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof NPlayAdapter.MyViewHolder) {
NPlayAdapter.MyViewHolder myViewHolder=
(NPlayAdapter.MyViewHolder) viewHolder;
mAdapter.onRowSelected(myViewHolder);
}
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* Callback回调监听时先调用的,用来判断当前是什么动作,比如判断方向
* 作用:哪个方向的拖动
*
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//方向:up,down,left,right
//常量
// ItemTouchHelper.UP 0x0001
// ItemTouchHelper.DOWN 0x0010
// ItemTouchHelper.LEFT
// ItemTouchHelper.RIGHT
//我要监听的拖拽方向是哪个方向
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//我要监听的swipe侧滑方向是哪个方向
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int flags = makeMovementFlags(dragFlags, swipeFlags);
return flags;
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
// 判断当前是否是swipe方式:侧滑。
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
//1.ItemView--ViewHolder; 2.侧滑条目的透明度程度关联谁?dX(delta增量,范围:当前条目-width~width)。
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
float alpha = 1;
if (layoutManager instanceof LinearLayoutManager) {
int orientation = ((LinearLayoutManager) layoutManager).getOrientation();
if (orientation == LinearLayoutManager.HORIZONTAL) {
alpha = 1 - Math.abs(dY) / viewHolder.itemView.getHeight();
} else if (orientation == LinearLayoutManager.VERTICAL) {
alpha = 1 - Math.abs(dX) / viewHolder.itemView.getWidth();
}
}
viewHolder.itemView.setAlpha(alpha);//1~0
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_DRAG) {
super.onSelectedChanged(viewHolder, actionState);
return;
}
if (dragAndDropCallback != null) {
dragAndDropCallback.onCellDragStarted(simpleRecyclerView, viewHolder.itemView, draggingItem, draggingItemPosition);
}
if (options.isDefaultEffectEnabled()) {
viewHolder.itemView.setSelected(true);
viewHolder.itemView.setAlpha(0.95f);
if (Build.VERSION.SDK_INT >= 21 && animator == null) {
animator = AnimatorInflater.loadStateListAnimator(viewHolder.itemView.getContext(), R.animator.raise);
viewHolder.itemView.setStateListAnimator(animator);
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE
&& !isViewCreateByAdapter(viewHolder)) {
View itemView = viewHolder.itemView;
c.save();
if (dX > 0) {
c.clipRect(itemView.getLeft(), itemView.getTop(),
itemView.getLeft() + dX, itemView.getBottom());
c.translate(itemView.getLeft(), itemView.getTop());
} else {
c.clipRect(itemView.getRight() + dX, itemView.getTop(),
itemView.getRight(), itemView.getBottom());
c.translate(itemView.getRight() + dX, itemView.getTop());
}
mAdapter.onItemSwiping(c, viewHolder, dX, dY, isCurrentlyActive);
c.restore();
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof RecyclerViewAdapter.MyViewHolder) {
RecyclerViewAdapter.MyViewHolder myViewHolder=
(RecyclerViewAdapter.MyViewHolder) viewHolder;
mAdapter.onRowSelected(myViewHolder);
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View itemView = viewHolder.itemView;
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE && dX < 0) {
// draw x mark
int itemHeight = itemView.getBottom() - itemView.getTop();
int intrinsicWidth = xMark.getIntrinsicWidth();
int intrinsicHeight = xMark.getIntrinsicWidth();
int xMarkLeft = itemView.getRight() - xMarkMargin - intrinsicWidth;
int xMarkRight = itemView.getRight() - xMarkMargin;
int xMarkTop = itemView.getTop() + (itemHeight - intrinsicHeight) / 2;
int xMarkBottom = xMarkTop + intrinsicHeight;
xMark.setBounds(xMarkLeft, xMarkTop, xMarkRight, xMarkBottom);
xMark.draw(c);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_wifi_provision, container, false);
mWifiInfoRecyclerView = (RecyclerView) view.findViewById(R.id.wifi_recycler_view);
mWifiInfoRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mWifiInfoAdapter = new WifiInfoAdapter(mWifiInfoList, this);
mWifiInfoRecyclerView.setAdapter(mWifiInfoAdapter);
DragSwipeController dragSwipeController = new DragSwipeController(mWifiInfoAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(dragSwipeController);
itemTouchHelper.attachToRecyclerView(mWifiInfoRecyclerView);
mAmazonFreeRTOSManager = AmazonFreeRTOSAgent.getAmazonFreeRTOSManager(getActivity());
mDevice = mAmazonFreeRTOSManager.getConnectedDevice(mDeviceMacAddr);
listNetworks();
return view;
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
boolean clickHeader = ((PowerfulRecyclerAdapter) mAdapter).hasHeaderView() && viewHolder.getAdapterPosition() == 0;
boolean clickFooter = ((PowerfulRecyclerAdapter) mAdapter).hasFootView() && viewHolder.getAdapterPosition() == ((PowerfulRecyclerAdapter)mAdapter).getItemCount() - 1;
boolean clickRecyclerFooter = ((PowerfulRecyclerAdapter) mAdapter).getPlugAdapter().getItemViewType(viewHolder.getAdapterPosition() - ((PowerfulRecyclerAdapter) mAdapter).getHeaderViewCount()) == PowerfulRecyclerView.TYPE_RECYCLER_FOOTER;
if(clickHeader || clickFooter || clickRecyclerFooter){
return;
}else{
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
float width = (float) viewHolder.itemView.getWidth();
float alpha = 1.0f - Math.abs(dX) / width;
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY,
actionState, isCurrentlyActive);
}
}
}
@Override
protected void initFragment(Bundle savedInstanceState) {
super.initFragment(savedInstanceState);
setLoadMoreEnable(true);
ItemTouchHelperCallback callback = new ItemTouchHelperCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, this);
itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView);
StickyRecyclerHeadersDecoration headersDecor = new StickyRecyclerHeadersDecoration(adapter);
recyclerView.addItemDecoration(headersDecor);
StickyRecyclerHeadersTouchListener touchListener =
new StickyRecyclerHeadersTouchListener(recyclerView, headersDecor);
touchListener.setOnHeaderClickListener((header, position, headerId) -> {
//wrong position returned
// recyclerView.smoothScrollToPosition(mPresenter.getFirstItemByDate((Long) header.getTag()));
});
recyclerView.addOnItemTouchListener(touchListener);
}
public ChannelFragmentAdapter(Context context, ItemTouchHelper helper, ChannelListBean channelListBean, RecyclerView view) {
this.mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mItemTouchHelper = helper;
this.mRecyclerView = view;
this.mChannelListBean = channelListBean;
if (channelListBean != null && !BaseTypeUtils.isListEmpty(channelListBean.listChannel)) {
for (int i = 0; i < channelListBean.listChannel.size(); i++) {
if (channelListBean.listChannel.get(i) != null) {
this.mMyChannelItems.add(channelListBean.listChannel.get(i));
if (((Channel) channelListBean.listChannel.get(i)).top == 0) {
this.mTopSize++;
}
if (((Channel) channelListBean.listChannel.get(i)).lock == 1) {
this.mLockSize++;
}
}
}
this.mImageDownloader = ImageDownloader.getInstance();
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
if (null != mOnSelectChangedListener) {
mOnSelectChangedListener.onSelectedChanged(viewHolder, actionState);
}
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// 移除 onTouchListener,否则触摸滑动会乱了
viewHolder.itemView.setOnTouchListener(null);
int layoutPosition = viewHolder.getLayoutPosition();
T remove = dataList.remove(layoutPosition);
adapter.notifyDataSetChanged();
if (mListener != null) {
mListener.onSwiped(viewHolder, remove, direction == ItemTouchHelper.LEFT ? CardConfig.SWIPED_LEFT : CardConfig.SWIPED_RIGHT);
}
// 当没有数据时回调 mListener
if (adapter.getItemCount() == 0) {
if (mListener != null) {
mListener.onSwipedClear();
}
}
}
private void initAdapter() {
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mAdapter = new TypeEditAdapter(mTypes);
ItemDragAndSwipeCallback itemDragAndSwipeCallback = new ItemDragAndSwipeCallback(mAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDragAndSwipeCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
itemDragAndSwipeCallback.setSwipeMoveFlags(ItemTouchHelper.START | ItemTouchHelper.END);
mAdapter.enableSwipeItem();
mAdapter.setOnItemSwipeListener(onItemSwipeListener);
mAdapter.enableDragItem(itemTouchHelper);
mAdapter.setOnItemDragListener(onItemDragListener);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addOnItemTouchListener(new OnSimpleClickListener(){
@Override
public void onItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
Type data = (Type) baseQuickAdapter.getData().get(i);
// 编辑分类
Intent intent = new Intent(mContext, AddEditTypeActivity.class);
intent.putExtra(AppConstants.EXTRA_ACCOUNT_TYPE, mType);
intent.putExtra(AppConstants.EXTRA_DATA, data);
startActivityForResult(intent, CODE_EDIT_TYPE);
}
});
}
/**
* 当item位置变换,滚动recycler到正确的位置
* TODO: 2017/2/21 0021 整理更优雅的写法 还有scrollToPosition(0)是否必要?
*/
private void scrollToRightPositionWhenItemChanged(RecyclerView recyclerView, View itemView, int itemPos) {
final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof ItemTouchHelper.ViewDropHandler) {
OrientationHelper helper = OrientationHelper.createVerticalHelper(layoutManager);
int start = helper.getDecoratedStart(itemView);
int end = helper.getDecoratedEnd(itemView);
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(
itemPos, lastItemPos > itemPos ? start : end - itemViewHeight);
// System.out.println(lastItemPos + "-" + childPos + "OrientationHelperOrientationHelper:"
// + height + "==" + itemViewHeight + "=||=" + start + "===" + end + "||||||" + myStart + "===" + itemTargetView.getHeight() );
}
if (lastItemPos == 0 || itemPos == 0) {
recyclerView.scrollToPosition(0);
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
toolbar = (Toolbar)findViewById(R.id.toolbar);
toolbar.setTitleTextColor(ContextCompat.getColor(this, R.color.semi_black));
setSupportActionBar(toolbar);
recycler = (RecyclerView)findViewById(R.id.recyclerView);
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setItemAnimator(new DefaultItemAnimator());
recycler.setAdapter(new AdapterRecyclerView(this, getItemList()));
ItemTouchHelper.Callback callback = new DeletionSwipeHelper(0, ItemTouchHelper.START, this, this);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recycler);
}
private void initViews() {
mRecyclerView = (SWRecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.getSwipeMessageBuilder()
.withFontPath(getString(R.string.droidSerif))
.withSwipeDirection(SwipeMessageBuilder.BOTH)
.build();
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
reminders.add("Reminder 1");
reminders.add("Reminder 2");
reminders.add("Reminder 3");
reminders.add("Reminder 4");
reminders.add("Reminder 5");
reminders.add("Reminder 6");
reminders.add("Reminder 7");
reminders.add("Reminder 8");
reminders.add("Reminder 9");
reminders.add("Reminder 10");
mAdapter = new io.huannguyen.swipeablerv.demo.SampleAdapter(reminders);
// allow swiping with both directions (left-to-right and right-to-left)
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setupSwipeToDismiss(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
}
private void initRecycle() {
adapter = new ChannelCustomAdapter(CustomNewsActivity.this);
adapter.setOnStartDragListener(CustomNewsActivity.this);
adapter.setOnChangeListener(CustomNewsActivity.this);
getBinding().content.setAdapter(adapter);
getBinding().content.setHasFixedSize(true);
ItemTouchHelper.Callback callback = simpleItemTouch(adapter);
mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(getBinding().content);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected(context);
}
super.onSelectedChanged(viewHolder, actionState);
/* final boolean swiping = actionState == ItemTouchHelper.ACTION_STATE_SWIPE;
swipeRefreshLayout.setEnabled(!swiping);*/
}
/**
* 获取动作标识
* 动作标识分:dragFlags和swipeFlags
* dragFlags:列表滚动方向的动作标识(如竖直列表就是上和下,水平列表就是左和右)
* wipeFlags:与列表滚动方向垂直的动作标识(如竖直列表就是左和右,水平列表就是上和下)
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int flags = makeMovementFlags(dragFlags, swipeFlags);
return flags;
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
//判断选中状态
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorAccent));
}
super.onSelectedChanged(viewHolder, actionState);
}
public SuggestionsRecyclerView(Context context, AttributeSet attrs) {
super(new ContextThemeWrapper(context, R.style.NewTabPageRecyclerView), attrs);
Resources res = getContext().getResources();
setBackgroundColor(ApiCompatibilityUtils.getColor(res, R.color.ntp_bg));
setLayoutParams(new LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
setFocusable(true);
setFocusableInTouchMode(true);
setContentDescription(res.getString(R.string.accessibility_new_tab_page));
mGestureDetector =
new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
boolean retVal = super.onSingleTapUp(e);
requestFocus();
return retVal;
}
});
mLayoutManager = new LinearLayoutManager(getContext());
setLayoutManager(mLayoutManager);
setHasFixedSize(true);
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchCallbacks());
helper.attachToRecyclerView(this);
mScrollEventReporter = new SuggestionsMetrics.ScrollEventReporter();
addOnScrollListener(mScrollEventReporter);
}
/**
* @see android.support.v7.widget.helper.ItemTouchHelper.Callback#getMovementFlags(RecyclerView, RecyclerView.ViewHolder)
* Sets the swipe flags for start and end.
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
// Fade out the view as it is swiped out of the parent's bounds
final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
{
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE)
{
SwipeAdapter.SwipeViewHolder itemViewHolder = (SwipeAdapter.SwipeViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
super.onSelectedChanged(viewHolder, actionState);
}
/**
* 设置滑动类型标记
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//START 右向左 END左向右 LEFT 向左 RIGHT向右 UP向上
//如果某个值传0,表示不触发该操作
return makeMovementFlags(ItemTouchHelper.UP| ItemTouchHelper.DOWN|ItemTouchHelper.START|ItemTouchHelper.END, ItemTouchHelper.START|ItemTouchHelper.END);
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0, swipeFlags = 0;
if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//设置侧滑方向为从左到右和从右到左都可以
swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
}
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
// Fade out the view as it is swiped out of the parent's bounds
final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}