Android中RecyclerView左右侧滑
16lz
2022-01-15
recyclerview在Android中应用的也很多了。废话不说多,先上图:
1.向右侧滑
2.向左侧滑
下面开始讨论一下关于这样的效果实怎么实现的:
1.首先创建一个侧滑的接口:
public interface ItemTouchHelperAdapter {/** * Called when an item has been dragged far enough to trigger a move. This is called every time * an item is shifted, and not at the end of a "drop" event.
*
* Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after * adjusting the underlying data to reflect this move. * * @param fromPosition The start position of the moved item. * @param toPosition Then resolved position of the moved item. * @return True if the item was moved to the new adapter position. * * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder) * @see RecyclerView.ViewHolder#getAdapterPosition() */boolean onItemMove(int fromPosition, int toPosition);/** * Called when an item has been dismissed by a swipe.
*
* Implementations should call {@link RecyclerView.Adapter#notifyItemRemoved(int)} after * adjusting the underlying data to reflect this removal. * * @param position The position of the item dismissed. * * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder) * @see RecyclerView.ViewHolder#getAdapterPosition() */void onItemDismiss(int position);
}
2.主要的实现类:
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {public static final float ALPHA_FULL = 1.0f;private final ItemTouchHelperAdapter mAdapter;private int socllType = 0;public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, int scollType) { mAdapter = adapter; this.socllType = scollType;}@Overridepublic boolean isLongPressDragEnabled() { return true;}@Overridepublic boolean isItemViewSwipeEnabled() { return true;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // Set movement flags based on the layout manager 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 = ItemTouchHelper.START | ItemTouchHelper.END; if (socllType == 0) { return makeMovementFlags(dragFlags, swipeFlags); } else if (socllType == 1) { return makeMovementFlags(0, swipeFlags); } else if (socllType == 2) { return makeMovementFlags(dragFlags, 0); } else { return makeMovementFlags(0, 0); } }}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { if (source.getItemViewType() != target.getItemViewType()) { return false; } // Notify the adapter of the move mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int i) { // Notify the adapter of the dismissal mAdapter.onItemDismiss(viewHolder.getAdapterPosition());}@Overridepublic 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); }}@Overridepublic 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);}@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); viewHolder.itemView.setAlpha(ALPHA_FULL); if (viewHolder instanceof ItemTouchHelperViewHolder) { // Tell the view holder it's time to restore the idle state ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; itemViewHolder.onItemClear(); }}
}
3.callback中的另外的一个接口:
public interface ItemTouchHelperViewHolder {/** * Called when the {@link ItemTouchHelper} first registers an item as being moved or swiped. * Implementations should update the item view to indicate it's active state. */ void onItemSelected();/** * Called when the {@link ItemTouchHelper} has completed the move or swipe, and the active item * state should be cleared. */ void onItemClear();}
4.使用,实现这个接口
public class SingleNumOutAdapter extends BaseRecycleAdapter implements ItemTouchHelperAdapter { //定义这个接口 private OnSingleNumOutLinsenter onSingleNumOutLinsenter; public void setOnSingleNumOutLinsenter(OnSingleNumOutLinsenter onSingleNumOutLinsenter) { this.onSingleNumOutLinsenter = onSingleNumOutLinsenter; } //自己写个接口 public interface OnSingleNumOutLinsenter { void onRemove(int position); } @Overridepublic boolean onItemMove(int fromPosition, int toPosition) { return false;}@Overridepublic void onItemDismiss(int position) { if (onSingleNumOutLinsenter != null) { onSingleNumOutLinsenter.onRemove(position); } }}
5.Activity的使用,在onCreate()中
ItemTouchHelper.Callback helperCallback = new SimpleItemTouchHelperCallback(adapter, 1); ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(helperCallback); mItemTouchHelper.attachToRecyclerView(rvSingleOrder); recyclerView.setAdapter(adapter); adapter.setOnSingleNumOutLinsenter(new SingleNumOutAdapter.OnSingleNumOutLinsenter() { @Override public void onRemove(int position) { } });
——————————— 骚气的分割线——————————————————————————————————
这样就实现了这个侧滑的效果了,打完收工,嘿嘿
更多相关文章
- 小心XmlPullParser.netText()方法
- 除去ScrollView拉到尽头时再拉的阴影效果
- 【Android】解析Paint类中MaskFilter的使用
- 实现录音,播放,以及Socket的上传和下载。。【处女作】
- android定时任务实现
- android 实现按钮旋转720°
- Android(安卓)– 自定义Loading圆点
- Android(安卓)Activity间的过渡动画
- 浅谈Java中Collections.sort对List排序的两种方法