久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单

發布時間:2023/12/10 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 刪除整個RecyclerView

? hisList.clear();
? hisAdapter.notifyDataSetChanged();

mScanListAdapter.setNewData(null);

剛開始只是使用了list.clear() 方法就是沒有效果,最后想起來了忘記了notifyDataSetChanged 刷新了

2?RecyclerView 刪除Item?

? ?hisList.remove(position);
? ?hisAdapter.notifyItemRemoved(position);
? ?hisAdapter.notifyItemChanged(0,hisList.size());
這個同樣的也是忘記了notifyItemChanged ,

以上使用把list 和adapter 替換自己命名的即可。。
?

?

效果:

recycleview依賴

compile('com.android.support:recyclerview-v7:25.1.1') {force = true }

1、adapter類:

Extension 是自定義類

public class RecOtherTypeAdapter extends RecyclerView.Adapter<RecOtherTypeAdapter.RecViewholder> {private Context context;private List<String> data = new ArrayList<>();private LayoutInflater layoutInflater;public RecOtherTypeAdapter(Context context) {this.context = context;layoutInflater = LayoutInflater.from(context);}public void setList(List<String> list) {data.clear();data.addAll(list);notifyDataSetChanged();}@Overridepublic RecViewholder onCreateViewHolder(ViewGroup parent, int viewType) {View view = layoutInflater.inflate(R.layout.layout_item, parent, false);return new RecViewholder(view);}@Overridepublic void onBindViewHolder(RecViewholder holder, final int position) {holder.textView.setText(data.get(position));holder.textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "s 66666====" +position, Toast.LENGTH_SHORT).show();}});holder.slide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "刪除" +position, Toast.LENGTH_SHORT).show();}});}@Overridepublic int getItemCount() {return data.size();}/*** view.getWidth()獲取的是屏幕中可以看到的大小.*/public class RecViewholder extends RecyclerView.ViewHolder implements Extension {public TextView textView;public TextView slide;public RecViewholder(View itemView) {super(itemView);textView = itemView.findViewById(R.id.item_text);slide = itemView.findViewById(R.id.item_slide);}@Overridepublic float getActionWidth() {return slide.getWidth();}}/*** 根據手機分辨率從DP轉成PX* @param context* @param dpValue* @return*/public static int dip2px(Context context, float dpValue) {float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);} }

1.2、item.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="1dp"><TextViewandroid:id="@+id/item_slide"android:layout_width="100dp"android:layout_height="50dp"android:layout_alignParentRight="true"android:background="#ff565b"android:gravity="center"android:text="刪 除"android:textColor="#ffffff"android:textSize="16sp" /><TextViewandroid:id="@+id/item_text"android:layout_width="match_parent"android:layout_height="50dp"android:background="#e1e1e1"android:gravity="center"android:tag="slide_flag"android:text="item"android:textColor="#333333"android:textSize="16sp" /></RelativeLayout>

1.3、activity詳情:

public class MainActivity extends AppCompatActivity {RecyclerView recyclerView;private RecOtherTypeAdapter recAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();}private void initView() {recyclerView = findViewById(R.id.recyclerViewTwo);recyclerView.setLayoutManager(new LinearLayoutManager(this));recAdapter = new RecOtherTypeAdapter(this);recyclerView.setAdapter(recAdapter);PlusItemSlideCallback callback = new PlusItemSlideCallback(WItemTouchHelperPlus.SLIDE_ITEM_TYPE_SLIDECONTAINER);WItemTouchHelperPlus extension = new WItemTouchHelperPlus(callback);extension.attachToRecyclerView(recyclerView);}private void initData() {List<String> list = new ArrayList<>();for (int i = 0; i < 30; i++) {list.add("Item " +i);}recAdapter.setList(list);} }

?

2、五個工具類(完整復用即可)

(1)、Extension

/*** 作者:created by meixi* 郵箱:13164716840@163.com* 日期:2018/9/3 09*/public interface Extension {float getActionWidth(); }

(2)、ItemTouchUIUtilImpl

class ItemTouchUIUtilImpl {static class Lollipop extends Honeycomb {@Overridepublic void onDraw(Canvas c, RecyclerView recyclerView, View view,float dX, float dY, int actionState, boolean isCurrentlyActive) {if (isCurrentlyActive) {Object originalElevation = view.getTag(R.id.item_touch_helper_previous_elevation);if (originalElevation == null) {originalElevation = ViewCompat.getElevation(view);float newElevation = 1f + findMaxElevation(recyclerView, view);ViewCompat.setElevation(view, newElevation);view.setTag(R.id.item_touch_helper_previous_elevation, originalElevation);}}super.onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive);}private float findMaxElevation(RecyclerView recyclerView, View itemView) {final int childCount = recyclerView.getChildCount();float max = 0;for (int i = 0; i < childCount; i++) {final View child = recyclerView.getChildAt(i);if (child == itemView) {continue;}final float elevation = ViewCompat.getElevation(child);if (elevation > max) {max = elevation;}}return max;}@Overridepublic void clearView(View view) {final Object tag = view.getTag(R.id.item_touch_helper_previous_elevation);if (tag != null && tag instanceof Float) {ViewCompat.setElevation(view, (Float) tag);}view.setTag(R.id.item_touch_helper_previous_elevation, null);super.clearView(view);}}static class Honeycomb implements ItemTouchUIUtil {@Overridepublic void clearView(View view) {ViewCompat.setTranslationX(view, 0f);ViewCompat.setTranslationY(view, 0f);}@Overridepublic void onSelected(View view) {}@Overridepublic void onDraw(Canvas c, RecyclerView recyclerView, View view,float dX, float dY, int actionState, boolean isCurrentlyActive) {ViewCompat.setTranslationX(view, dX);ViewCompat.setTranslationY(view, dY);}@Overridepublic void onDrawOver(Canvas c, RecyclerView recyclerView,View view, float dX, float dY, int actionState, boolean isCurrentlyActive) {}}static class Gingerbread implements ItemTouchUIUtil {private void draw(Canvas c, RecyclerView parent, View view,float dX, float dY) {c.save();c.translate(dX, dY);parent.drawChild(c, view, 0);c.restore();}@Overridepublic void clearView(View view) {view.setVisibility(View.VISIBLE);}@Overridepublic void onSelected(View view) {view.setVisibility(View.INVISIBLE);}@Overridepublic void onDraw(Canvas c, RecyclerView recyclerView, View view,float dX, float dY, int actionState, boolean isCurrentlyActive) {if (actionState != ItemTouchHelper.ACTION_STATE_DRAG) {draw(c, recyclerView, view, dX, dY);}}@Overridepublic void onDrawOver(Canvas c, RecyclerView recyclerView,View view, float dX, float dY,int actionState, boolean isCurrentlyActive) {if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {draw(c, recyclerView, view, dX, dY);}}} }

3、PlusItemSlideCallback

public class PlusItemSlideCallback extends WItemTouchHelperPlus.Callback {String type;public PlusItemSlideCallback(String type) {this.type = type;}@Overridepublic boolean isItemViewSwipeEnabled() {return true;}@Overrideint getSlideViewWidth() {return 0;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return makeMovementFlags(0, ItemTouchHelper.START);}@Overridepublic String getItemSlideType() {return type;}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {return false;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}@Overridepublic void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {if(viewHolder instanceof RecOtherTypeAdapter.RecViewholder){RecOtherTypeAdapter.RecViewholder holder = (RecOtherTypeAdapter.RecViewholder) viewHolder;float actionWidth = holder.getActionWidth();if (dX < -actionWidth) {dX = -actionWidth;}holder.textView.setTranslationX(dX);}return;}@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {super.clearView(recyclerView, viewHolder);} }

(4)、RecOtherTypeAdapter

public class RecOtherTypeAdapter extends RecyclerView.Adapter<RecOtherTypeAdapter.RecViewholder> {private Context context;private List<String> data = new ArrayList<>();private LayoutInflater layoutInflater;public RecOtherTypeAdapter(Context context) {this.context = context;layoutInflater = LayoutInflater.from(context);}public void setList(List<String> list) {data.clear();data.addAll(list);notifyDataSetChanged();}@Overridepublic RecViewholder onCreateViewHolder(ViewGroup parent, int viewType) {View view = layoutInflater.inflate(R.layout.layout_item, parent, false);return new RecViewholder(view);}@Overridepublic void onBindViewHolder(RecViewholder holder, final int position) {holder.textView.setText(data.get(position));holder.textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "s 66666====" +position, Toast.LENGTH_SHORT).show();}});holder.slide.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "刪除" +position, Toast.LENGTH_SHORT).show();}});}@Overridepublic int getItemCount() {return data.size();}/*** view.getWidth()獲取的是屏幕中可以看到的大小.*/public class RecViewholder extends RecyclerView.ViewHolder implements Extension {public TextView textView;public TextView slide;public RecViewholder(View itemView) {super(itemView);textView = itemView.findViewById(R.id.item_text);slide = itemView.findViewById(R.id.item_slide);}@Overridepublic float getActionWidth() {return slide.getWidth();}}/*** 根據手機分辨率從DP轉成PX* @param context* @param dpValue* @return*/public static int dip2px(Context context, float dpValue) {float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);} }

(5)WItemTouchHelperPlus

public class WItemTouchHelperPlus extends RecyclerView.ItemDecorationimplements RecyclerView.OnChildAttachStateChangeListener {/*** 側滑顯示的布局 跟隨 在滑動布局的下面的標記 看場景選擇*/public final static String SLIDE_ITEM_TYPE_ITEMVIEW = "itemView";/*** 側滑顯示的布局 隱藏 在滑動布局的下面的標記 看場景選擇*/public final static String SLIDE_ITEM_TYPE_SLIDECONTAINER = "slideContainer";/*** Up direction, used for swipe & drag control.*/public static final int UP = 1;/*** Down direction, used for swipe & drag control.*/public static final int DOWN = 1 << 1;/*** Left direction, used for swipe & drag control.*/public static final int LEFT = 1 << 2;/*** Right direction, used for swipe & drag control.*/public static final int RIGHT = 1 << 3;// If you change these relative direction values, update Callback#convertToAbsoluteDirection,// Callback#convertToRelativeDirection./*** Horizontal start direction. Resolved to LEFT or RIGHT depending on RecyclerView's layout* direction. Used for swipe & drag control.*/public static final int START = LEFT << 2;/*** Horizontal end direction. Resolved to LEFT or RIGHT depending on RecyclerView's layout* direction. Used for swipe & drag control.*/public static final int END = RIGHT << 2;/*** WItemTouchHelperPlus is in idle state. At this state, either there is no related motion event by* the user or latest motion events have not yet triggered a swipe or drag.*/public static final int ACTION_STATE_IDLE = 0;/*** A View is currently being swiped.*/public static final int ACTION_STATE_SWIPE = 1;/*** A View is currently being dragged.*/public static final int ACTION_STATE_DRAG = 2;/*** Animation type for views which are swiped successfully.*/public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 1 << 1;/*** Animation type for views which are not completely swiped thus will animate back to their* original position.*/public static final int ANIMATION_TYPE_SWIPE_CANCEL = 1 << 2;/*** Animation type for views that were dragged and now will animate to their final position.*/public static final int ANIMATION_TYPE_DRAG = 1 << 3;static final String TAG = "WItemTouchHelperPlus";static final boolean DEBUG = false;static final int ACTIVE_POINTER_ID_NONE = -1;static final int DIRECTION_FLAG_COUNT = 8;private static final int ACTION_MODE_IDLE_MASK = (1 << DIRECTION_FLAG_COUNT) - 1;static final int ACTION_MODE_SWIPE_MASK = ACTION_MODE_IDLE_MASK << DIRECTION_FLAG_COUNT;static final int ACTION_MODE_DRAG_MASK = ACTION_MODE_SWIPE_MASK << DIRECTION_FLAG_COUNT;/*** The unit we are using to track velocity*/private static final int PIXELS_PER_SECOND = 1000;/*** Views, whose state should be cleared after they are detached from RecyclerView.* This is necessary after swipe dismissing an item. We wait until animator finishes its job* to clean these views.*/final List<View> mPendingCleanup = new ArrayList<View>();/*** Re-use array to calculate dx dy for a ViewHolder*/private final float[] mTmpPosition = new float[2];/*** Currently selected view holder*/RecyclerView.ViewHolder mSelected = null;/*** Previous selected view holder*/RecyclerView.ViewHolder mPreOpened = null;/*** The reference coordinates for the action start. For drag & drop, this is the time long* press is completed vs for swipe, this is the initial touch point.*/float mInitialTouchX;float mInitialTouchY;/*** Set when WItemTouchHelperPlus is assigned to a RecyclerView.*/float mSwipeEscapeVelocity;/*** Set when WItemTouchHelperPlus is assigned to a RecyclerView.*/float mMaxSwipeVelocity;/*** The diff between the last event and initial touch.*/float mDx;float mDy;/*** The coordinates of the selected view at the time it is selected. We record these values* when action starts so that we can consistently position it even if LayoutManager moves the* View.*/float mSelectedStartX;float mSelectedStartY;/*** The pointer we are tracking.*/int mActivePointerId = ACTIVE_POINTER_ID_NONE;/*** Developer callback which controls the behavior of WItemTouchHelperPlus.*/WItemTouchHelperPlus.Callback mCallback;/*** Current mode.*/int mActionState = ACTION_STATE_IDLE;/*** The direction flags obtained from unmasking* {@link WItemTouchHelperPlus.Callback#getAbsoluteMovementFlags(RecyclerView, RecyclerView.ViewHolder)} for the current* action state.*/int mSelectedFlags;/*** When a View is dragged or swiped and needs to go back to where it was, we create a Recover* Animation and animate it to its location using this custom Animator, instead of using* framework Animators.* Using framework animators has the side effect of clashing with ItemAnimator, creating* jumpy UIs.*/List<WItemTouchHelperPlus.RecoverAnimation> mRecoverAnimations = new ArrayList<>();private int mSlop;RecyclerView mRecyclerView;/*** 判斷當前側滑布局的標記* {@link #SLIDE_ITEM_TYPE_ITEMVIEW}*/private boolean slideItemTypeIsItemView() {return SLIDE_ITEM_TYPE_ITEMVIEW.equals(mCallback.getItemSlideType());}/*** 判斷當前側滑布局的標記* {@link #SLIDE_ITEM_TYPE_SLIDECONTAINER}*/private boolean slideItemTypeIsContainerView() {return SLIDE_ITEM_TYPE_SLIDECONTAINER.equals(mCallback.getItemSlideType());}/*** When user drags a view to the edge, we start scrolling the LayoutManager as long as View* is partially out of bounds.*/final Runnable mScrollRunnable = new Runnable() {@Overridepublic void run() {if (mSelected != null && scrollIfNecessary()) {if (mSelected != null) { //it might be lost during scrollingmoveIfNecessary(mSelected);}mRecyclerView.removeCallbacks(mScrollRunnable);ViewCompat.postOnAnimation(mRecyclerView, this);}}};/*** Used for detecting fling swipe*/VelocityTracker mVelocityTracker;//re-used list for selecting a swap targetprivate List<RecyclerView.ViewHolder> mSwapTargets;//re used for for sorting swap targetsprivate List<Integer> mDistances;/*** If drag & drop is supported, we use child drawing order to bring them to front.*/private RecyclerView.ChildDrawingOrderCallback mChildDrawingOrderCallback = null;/*** This keeps a reference to the child dragged by the user. Even after user stops dragging,* until view reaches its final position (end of recover animation), we keep a reference so* that it can be drawn above other children.*/View mOverdrawChild = null;/*** We cache the position of the overdraw child to avoid recalculating it each time child* position callback is called. This value is invalidated whenever a child is attached or* detached.*/int mOverdrawChildPosition = -1;/*** Used to detect long press.*/GestureDetectorCompat mGestureDetector;/*** Is the last open item closed*/private boolean closePreItem = false;/*** Whether the current entry has been clicked*/private boolean mClick;float mLastX = 0;private final RecyclerView.OnItemTouchListener mOnItemTouchListener = new RecyclerView.OnItemTouchListener() {@Overridepublic boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent event) {mGestureDetector.onTouchEvent(event);if (DEBUG) {Log.d(TAG, "intercept: x:" + event.getX() + ",y:" + event.getY() + ", " + event);}final int action = event.getActionMasked();if (action == MotionEvent.ACTION_DOWN) {mClick = true;mLastX = event.getX();mActivePointerId = event.getPointerId(0);mInitialTouchX = event.getX();mInitialTouchY = event.getY();obtainVelocityTracker();if (mSelected == null) {final WItemTouchHelperPlus.RecoverAnimation animation = findAnimation(event);if (animation != null) {//這里是當item側滑已經展開的時候.如果animation不為null 說明Item的側滑是展開的狀態 需要進行關閉mInitialTouchX -= animation.mX;mInitialTouchY -= animation.mY;endRecoverAnimation(animation.mViewHolder, true);if (mPendingCleanup.remove(animation.mViewHolder.itemView)) {mCallback.clearView(mRecyclerView, animation.mViewHolder);}select(animation.mViewHolder, animation.mActionState);updateDxDy(event, mSelectedFlags, 0);} else {if (null != mPreOpened) {closePreItem = true;closeOpenedPreItem(mPreOpened);return true;}}}} else if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {closePreItem = false;//這邊是新增的if (mClick && action == MotionEvent.ACTION_UP) {doChildClickEvent(event.getRawX(), event.getRawY());}mClick = false;mActivePointerId = ACTIVE_POINTER_ID_NONE;select(null, ACTION_STATE_IDLE);} else if (mActivePointerId != ACTIVE_POINTER_ID_NONE && !closePreItem) {// in a non scroll orientation, if distance change is above threshold, we// can select the itemfinal int index = event.findPointerIndex(mActivePointerId);if (DEBUG) {Log.d(TAG, "pointer index " + index);}if (index >= 0) {checkSelectForSwipe(action, event, index);}}if (mVelocityTracker != null) {mVelocityTracker.addMovement(event);}return mSelected != null;}/*** 判斷當前點擊的位置是否為view并且該View實現了OnClickListener事件* @param x* @param y*/private void doChildClickEvent(float x, float y) {if (mSelected == null) return;View consumeEventView = mSelected.itemView;if (consumeEventView instanceof ViewGroup) {consumeEventView = findConsumeView((ViewGroup) consumeEventView, x, y);}if (consumeEventView != null) {consumeEventView.performClick();}}/*** 查找view* @param parent 父容器* @param x 點擊事件的x坐標* @param y 點擊事件的y坐標* @return*/private View findConsumeView(ViewGroup parent, float x, float y) {for (int i = 0; i < parent.getChildCount(); i++) {View child = parent.getChildAt(i);if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) {View view = findConsumeView((ViewGroup) child, x, y);if (view != null) {return view;}} else {if (isInBoundsClickable((int) x, (int) y, child)) return child;}}if (isInBoundsClickable((int) x, (int) y, parent)) return parent;return null;}/*** 邊界判斷* @param x* @param y* @param child 再點擊事件下找到的view* @return*/private boolean isInBoundsClickable(int x, int y, View child) {int[] location = new int[2];child.getLocationOnScreen(location);Rect rect = new Rect(location[0], location[1], location[0] + child.getWidth(), location[1] + child.getHeight());if (rect.contains(x, y) && ViewCompat.hasOnClickListeners(child)&& child.getVisibility() == View.VISIBLE) {return true;}return false;}@Overridepublic void onTouchEvent(RecyclerView recyclerView, MotionEvent event) {mGestureDetector.onTouchEvent(event);if (mVelocityTracker != null) {mVelocityTracker.addMovement(event);}if (mActivePointerId == ACTIVE_POINTER_ID_NONE) {return;}final int action = event.getActionMasked();final int activePointerIndex = event.findPointerIndex(mActivePointerId);if (activePointerIndex >= 0) {checkSelectForSwipe(action, event, activePointerIndex);}RecyclerView.ViewHolder viewHolder = mSelected;if (viewHolder == null) {return;}switch (action) {case MotionEvent.ACTION_MOVE: {// Find the index of the active pointer and fetch its positionif (activePointerIndex >= 0) {if (Math.abs(event.getX() - mLastX) > mSlop) mClick = false;mLastX = event.getX();updateDxDy(event, mSelectedFlags, activePointerIndex);moveIfNecessary(viewHolder);mRecyclerView.removeCallbacks(mScrollRunnable);mScrollRunnable.run();mRecyclerView.invalidate();}break;}case MotionEvent.ACTION_CANCEL:if (mVelocityTracker != null) {mVelocityTracker.clear();}// fall throughcase MotionEvent.ACTION_UP:if (mClick) {doChildClickEvent(event.getRawX(), event.getRawY());}mClick = false;select(null, ACTION_STATE_IDLE);mActivePointerId = ACTIVE_POINTER_ID_NONE;break;case MotionEvent.ACTION_POINTER_UP: {mClick = false;final int pointerIndex = event.getActionIndex();final int pointerId = event.getPointerId(pointerIndex);if (pointerId == mActivePointerId) {// This was our active pointer going up. Choose a new// active pointer and adjust accordingly.final int newPointerIndex = pointerIndex == 0 ? 1 : 0;mActivePointerId = event.getPointerId(newPointerIndex);updateDxDy(event, mSelectedFlags, pointerIndex);}break;}default:mClick = false;break;}}@Overridepublic void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {if (!disallowIntercept) {return;}select(null, ACTION_STATE_IDLE);}};/*** Temporary rect instance that is used when we need to lookup Item decorations.*/private Rect mTmpRect;/*** When user started to drag scroll. Reset when we don't scroll*/private long mDragScrollStartTimeInMs;/*** Creates an WItemTouchHelperPlus that will work with the given Callback.* <p>* You can attach WItemTouchHelperPlus to a RecyclerView via* {@link #attachToRecyclerView(RecyclerView)}. Upon attaching, it will add an item decoration,* an onItemTouchListener and a Child attach / detach listener to the RecyclerView.** @param callback The Callback which controls the behavior of this touch helper.*/public WItemTouchHelperPlus(WItemTouchHelperPlus.Callback callback) {mCallback = callback;}private boolean hitTest(View child, float x, float y, float left, float top, RecyclerView.ViewHolder vh) {return x >= left&& x <= left + child.getWidth()&& y >= top&& y <= top + child.getHeight();}/*** Attaches the WItemTouchHelperPlus to the provided RecyclerView. If TouchHelper is already* attached to a RecyclerView, it will first detach from the previous one. You can call this* method with {@code null} to detach it from the current RecyclerView.** @param recyclerView The RecyclerView instance to which you want to add this helper or* {@code null} if you want to remove WItemTouchHelperPlus from the current* RecyclerView.*/public void attachToRecyclerView(@Nullable RecyclerView recyclerView) {if (mRecyclerView == recyclerView) {return; // nothing to do}if (mRecyclerView != null) {destroyCallbacks();}mRecyclerView = recyclerView;if (mRecyclerView != null) {final Resources resources = recyclerView.getResources();mSwipeEscapeVelocity = resources.getDimension(android.support.v7.recyclerview.R.dimen.item_touch_helper_swipe_escape_velocity);mMaxSwipeVelocity = resources.getDimension(android.support.v7.recyclerview.R.dimen.item_touch_helper_swipe_escape_max_velocity);setupCallbacks();mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if (newState == RecyclerView.SCROLL_STATE_DRAGGING && mPreOpened != null) {closeOpenedPreItem(mPreOpened);}}});}}/*** 關閉一個打開的Item** @param viewHolder 要關閉的Item的ViewHolder*/private void closeOpenedPreItem(RecyclerView.ViewHolder viewHolder) {if (viewHolder == null) return;final View view = getItemFrontView(viewHolder);if (view == null) return;ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "translationX", view.getTranslationX(), 0f);objectAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);if (mPreOpened != null) {if (mPendingCleanup.remove(mPreOpened.itemView)) {mCallback.clearView(mRecyclerView, mPreOpened);}}endRecoverAnimation(mPreOpened, true);mPreOpened = mSelected;}@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);mRecoverAnimations.clear();}});objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());objectAnimator.start();}/*** @param viewHolder* @return*/public View getItemFrontView(RecyclerView.ViewHolder viewHolder) {if (viewHolder == null) return null;if (viewHolder.itemView instanceof ViewGroup) {ViewGroup viewGroup = (ViewGroup) viewHolder.itemView;for (int i = 0; i < viewGroup.getChildCount(); i++) {View childAt = viewGroup.getChildAt(i);String tag = (String) childAt.getTag();/*這個標記必須再xml布局里面.<RelativeLayoutandroid:id="@+id/slide_itemView"android:clipChildren="false"android:tag="slide_flag"android:layout_width="match_parent"android:layout_height="match_parent">*/if ("slide_flag".equals(tag)) {return childAt;}}return viewHolder.itemView;} else {return viewHolder.itemView;}}private void setupCallbacks() {ViewConfiguration vc = ViewConfiguration.get(mRecyclerView.getContext());mSlop = vc.getScaledTouchSlop();mRecyclerView.addItemDecoration(this);mRecyclerView.addOnItemTouchListener(mOnItemTouchListener);mRecyclerView.addOnChildAttachStateChangeListener(this);initGestureDetector();}private void destroyCallbacks() {mRecyclerView.removeItemDecoration(this);mRecyclerView.removeOnItemTouchListener(mOnItemTouchListener);mRecyclerView.removeOnChildAttachStateChangeListener(this);// clean all attachedfinal int recoverAnimSize = mRecoverAnimations.size();for (int i = recoverAnimSize - 1; i >= 0; i--) {final WItemTouchHelperPlus.RecoverAnimation recoverAnimation = mRecoverAnimations.get(0);mCallback.clearView(mRecyclerView, recoverAnimation.mViewHolder);}mRecoverAnimations.clear();mOverdrawChild = null;mOverdrawChildPosition = -1;releaseVelocityTracker();}private void initGestureDetector() {if (mGestureDetector != null) {return;}mGestureDetector = new GestureDetectorCompat(mRecyclerView.getContext(),new WItemTouchHelperPlus.WItemTouchHelperPlusGestureListener());}private void getSelectedDxDy(float[] outPosition) {if ((mSelectedFlags & (LEFT | RIGHT)) != 0) {outPosition[0] = mSelectedStartX + mDx - mSelected.itemView.getLeft();} else {outPosition[0] = mSelected.itemView.getTranslationX();}if ((mSelectedFlags & (UP | DOWN)) != 0) {outPosition[1] = mSelectedStartY + mDy - mSelected.itemView.getTop();} else {outPosition[1] = mSelected.itemView.getTranslationY();}}@Overridepublic void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {float dx = 0, dy = 0;if (mSelected != null) {getSelectedDxDy(mTmpPosition);dx = mTmpPosition[0];dy = mTmpPosition[1];}mCallback.onDrawOver(c, parent, mSelected,mRecoverAnimations, mActionState, dx, dy);}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {// we don't know if RV changed something so we should invalidate this index.mOverdrawChildPosition = -1;float dx = 0, dy = 0;if (mSelected != null) {getSelectedDxDy(mTmpPosition);dx = mTmpPosition[0];dy = mTmpPosition[1];}mCallback.onDraw(c, parent, mSelected,mRecoverAnimations, mActionState, dx, dy);}private float getSwipeWidth() {if (mSelected instanceof Extension) {return ((Extension) mSelected).getActionWidth();}return mRecyclerView.getWidth();}/*** Starts dragging or swiping the given View. Call with null if you want to clear it.** @param selected The ViewHolder to drag or swipe. Can be null if you want to cancel the* current action* @param actionState The type of action*/void select(RecyclerView.ViewHolder selected, int actionState) {if (selected == mSelected && actionState == mActionState) {return;}mDragScrollStartTimeInMs = Long.MIN_VALUE;final int prevActionState = mActionState;// prevent duplicate animationsendRecoverAnimation(selected, true);mActionState = actionState;if (actionState == ACTION_STATE_DRAG) {// we remove after animation is complete. this means we only elevate the last drag// child but that should perform good enough as it is very hard to start dragging a// new child before the previous one settles.mOverdrawChild = selected.itemView;addChildDrawingOrderCallback();}int actionStateMask = (1 << (DIRECTION_FLAG_COUNT + DIRECTION_FLAG_COUNT * actionState))- 1;boolean preventLayout = false;if (mSelected != null) {final RecyclerView.ViewHolder prevSelected = mSelected;if (prevSelected.itemView.getParent() != null) {final int swipeDir = prevActionState == ACTION_STATE_DRAG ? 0: swipeIfNecessary(prevSelected);releaseVelocityTracker();// find where we should animate tofinal float targetTranslateX, targetTranslateY;int animationType;switch (swipeDir) {case LEFT:case RIGHT:case START:case END:targetTranslateY = 0;float swipeWidth = getSwipeWidth();targetTranslateX = Math.signum(mDx) * swipeWidth;break;case UP:case DOWN:targetTranslateX = 0;targetTranslateY = Math.signum(mDy) * mRecyclerView.getHeight();break;default:targetTranslateX = 0;targetTranslateY = 0;}if (prevActionState == ACTION_STATE_DRAG) {animationType = ANIMATION_TYPE_DRAG;} else if (swipeDir > 0) {animationType = ANIMATION_TYPE_SWIPE_SUCCESS;} else {animationType = ANIMATION_TYPE_SWIPE_CANCEL;}getSelectedDxDy(mTmpPosition);final float currentTranslateX = mTmpPosition[0];final float currentTranslateY = mTmpPosition[1];final WItemTouchHelperPlus.RecoverAnimation rv = new WItemTouchHelperPlus.RecoverAnimation(prevSelected, animationType,prevActionState, currentTranslateX, currentTranslateY,targetTranslateX, targetTranslateY) {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);if (this.mOverridden) {return;}if (swipeDir <= 0) {mPreOpened = null;// this is a drag or failed swipe. recover immediatelymCallback.clearView(mRecyclerView, prevSelected);// full cleanup will happen on onDrawOver} else {// wait until remove animation is complete.mPendingCleanup.add(prevSelected.itemView);mPreOpened = prevSelected;mIsPendingCleanup = true;if (swipeDir > 0) {// Animation might be ended by other animators during a layout.// We defer callback to avoid editing adapter during a layout.postDispatchSwipe(this, swipeDir);}}// removed from the list after it is drawn for the last timeif (mOverdrawChild == prevSelected.itemView) {removeChildDrawingOrderCallbackIfNecessary(prevSelected.itemView);}}@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);Log.e("WANG", "WItemTouchHelperPlus.onAnimationStart Recover ");}};final long duration = mCallback.getAnimationDuration(mRecyclerView, animationType,targetTranslateX - currentTranslateX, targetTranslateY - currentTranslateY);rv.setDuration(duration);mRecoverAnimations.add(rv);rv.start();preventLayout = true;} else {removeChildDrawingOrderCallbackIfNecessary(prevSelected.itemView);mCallback.clearView(mRecyclerView, prevSelected);}mSelected = null;}if (selected != null) {mSelectedFlags =(mCallback.getAbsoluteMovementFlags(mRecyclerView, selected) & actionStateMask)>> (mActionState * DIRECTION_FLAG_COUNT);mSelectedStartX = selected.itemView.getLeft();mSelectedStartY = selected.itemView.getTop();mSelected = selected;if (actionState == ACTION_STATE_DRAG) {mSelected.itemView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);}}final ViewParent rvParent = mRecyclerView.getParent();if (rvParent != null) {rvParent.requestDisallowInterceptTouchEvent(mSelected != null);}if (!preventLayout) {mRecyclerView.getLayoutManager().requestSimpleAnimationsInNextLayout();}mCallback.onSelectedChanged(mSelected, mActionState);mRecyclerView.invalidate();}void postDispatchSwipe(final WItemTouchHelperPlus.RecoverAnimation anim, final int swipeDir) {// wait until animations are complete.mRecyclerView.post(new Runnable() {@Overridepublic void run() {if (mRecyclerView != null && mRecyclerView.isAttachedToWindow()&& !anim.mOverridden&& anim.mViewHolder.getAdapterPosition() != RecyclerView.NO_POSITION) {final RecyclerView.ItemAnimator animator = mRecyclerView.getItemAnimator();// if animator is running or we have other active recover animations, we try// not to call onSwiped because DefaultItemAnimator is not good at merging// animations. Instead, we wait and batch.if ((animator == null || !animator.isRunning(null))&& !hasRunningRecoverAnim()) {mCallback.onSwiped(anim.mViewHolder, swipeDir);} else {mRecyclerView.post(this);}}}});}boolean hasRunningRecoverAnim() {final int size = mRecoverAnimations.size();for (int i = 0; i < size; i++) {if (!mRecoverAnimations.get(i).mEnded) {return true;}}return false;}/*** If user drags the view to the edge, trigger a scroll if necessary.*/boolean scrollIfNecessary() {if (mSelected == null) {mDragScrollStartTimeInMs = Long.MIN_VALUE;return false;}final long now = System.currentTimeMillis();final long scrollDuration = mDragScrollStartTimeInMs== Long.MIN_VALUE ? 0 : now - mDragScrollStartTimeInMs;RecyclerView.LayoutManager lm = mRecyclerView.getLayoutManager();if (mTmpRect == null) {mTmpRect = new Rect();}int scrollX = 0;int scrollY = 0;lm.calculateItemDecorationsForChild(mSelected.itemView, mTmpRect);if (lm.canScrollHorizontally()) {int curX = (int) (mSelectedStartX + mDx);final int leftDiff = curX - mTmpRect.left - mRecyclerView.getPaddingLeft();if (mDx < 0 && leftDiff < 0) {scrollX = leftDiff;} else if (mDx > 0) {final int rightDiff =curX + mSelected.itemView.getWidth() + mTmpRect.right- (mRecyclerView.getWidth() - mRecyclerView.getPaddingRight());if (rightDiff > 0) {scrollX = rightDiff;}}}if (lm.canScrollVertically()) {int curY = (int) (mSelectedStartY + mDy);final int topDiff = curY - mTmpRect.top - mRecyclerView.getPaddingTop();if (mDy < 0 && topDiff < 0) {scrollY = topDiff;} else if (mDy > 0) {final int bottomDiff = curY + mSelected.itemView.getHeight() + mTmpRect.bottom- (mRecyclerView.getHeight() - mRecyclerView.getPaddingBottom());if (bottomDiff > 0) {scrollY = bottomDiff;}}}if (scrollX != 0) {scrollX = mCallback.interpolateOutOfBoundsScroll(mRecyclerView,mSelected.itemView.getWidth(), scrollX,mRecyclerView.getWidth(), scrollDuration);}if (scrollY != 0) {scrollY = mCallback.interpolateOutOfBoundsScroll(mRecyclerView,mSelected.itemView.getHeight(), scrollY,mRecyclerView.getHeight(), scrollDuration);}if (scrollX != 0 || scrollY != 0) {if (mDragScrollStartTimeInMs == Long.MIN_VALUE) {mDragScrollStartTimeInMs = now;}mRecyclerView.scrollBy(scrollX, scrollY);return true;}mDragScrollStartTimeInMs = Long.MIN_VALUE;return false;}private List<RecyclerView.ViewHolder> findSwapTargets(RecyclerView.ViewHolder viewHolder) {if (mSwapTargets == null) {mSwapTargets = new ArrayList<RecyclerView.ViewHolder>();mDistances = new ArrayList<Integer>();} else {mSwapTargets.clear();mDistances.clear();}final int margin = mCallback.getBoundingBoxMargin();final int left = Math.round(mSelectedStartX + mDx) - margin;final int top = Math.round(mSelectedStartY + mDy) - margin;final int right = left + viewHolder.itemView.getWidth() + 2 * margin;final int bottom = top + viewHolder.itemView.getHeight() + 2 * margin;final int centerX = (left + right) / 2;final int centerY = (top + bottom) / 2;final RecyclerView.LayoutManager lm = mRecyclerView.getLayoutManager();final int childCount = lm.getChildCount();for (int i = 0; i < childCount; i++) {View other = lm.getChildAt(i);if (other == viewHolder.itemView) {continue; //myself!}if (other.getBottom() < top || other.getTop() > bottom|| other.getRight() < left || other.getLeft() > right) {continue;}final RecyclerView.ViewHolder otherVh = mRecyclerView.getChildViewHolder(other);if (mCallback.canDropOver(mRecyclerView, mSelected, otherVh)) {// find the index to addfinal int dx = Math.abs(centerX - (other.getLeft() + other.getRight()) / 2);final int dy = Math.abs(centerY - (other.getTop() + other.getBottom()) / 2);final int dist = dx * dx + dy * dy;int pos = 0;final int cnt = mSwapTargets.size();for (int j = 0; j < cnt; j++) {if (dist > mDistances.get(j)) {pos++;} else {break;}}mSwapTargets.add(pos, otherVh);mDistances.add(pos, dist);}}return mSwapTargets;}/*** Checks if we should swap w/ another view holder.*/void moveIfNecessary(RecyclerView.ViewHolder viewHolder) {if (mRecyclerView.isLayoutRequested()) {return;}if (mActionState != ACTION_STATE_DRAG) {return;}final float threshold = mCallback.getMoveThreshold(viewHolder);final int x = (int) (mSelectedStartX + mDx);final int y = (int) (mSelectedStartY + mDy);if (Math.abs(y - viewHolder.itemView.getTop()) < viewHolder.itemView.getHeight() * threshold&& Math.abs(x - viewHolder.itemView.getLeft())< viewHolder.itemView.getWidth() * threshold) {return;}List<RecyclerView.ViewHolder> swapTargets = findSwapTargets(viewHolder);if (swapTargets.size() == 0) {return;}// may swap.RecyclerView.ViewHolder target = mCallback.chooseDropTarget(viewHolder, swapTargets, x, y);if (target == null) {mSwapTargets.clear();mDistances.clear();return;}final int toPosition = target.getAdapterPosition();final int fromPosition = viewHolder.getAdapterPosition();if (mCallback.onMove(mRecyclerView, viewHolder, target)) {// keep target visiblemCallback.onMoved(mRecyclerView, viewHolder, fromPosition,target, toPosition, x, y);}}@Overridepublic void onChildViewAttachedToWindow(View view) {}@Overridepublic void onChildViewDetachedFromWindow(View view) {removeChildDrawingOrderCallbackIfNecessary(view);final RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(view);if (holder == null) {return;}if (mSelected != null && holder == mSelected) {select(null, ACTION_STATE_IDLE);} else {endRecoverAnimation(holder, false); // this may push it into pending cleanup list.if (mPendingCleanup.remove(holder.itemView)) {mCallback.clearView(mRecyclerView, holder);}}}/*** Returns the animation type or 0 if cannot be found.*/int endRecoverAnimation(RecyclerView.ViewHolder viewHolder, boolean override) {final int recoverAnimSize = mRecoverAnimations.size();for (int i = recoverAnimSize - 1; i >= 0; i--) {final WItemTouchHelperPlus.RecoverAnimation anim = mRecoverAnimations.get(i);if (anim.mViewHolder == viewHolder) {anim.mOverridden |= override;if (!anim.mEnded) {anim.cancel();}mRecoverAnimations.remove(i);return anim.mAnimationType;}}return 0;}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent,RecyclerView.State state) {outRect.setEmpty();}void obtainVelocityTracker() {if (mVelocityTracker != null) {mVelocityTracker.recycle();}mVelocityTracker = VelocityTracker.obtain();}private void releaseVelocityTracker() {if (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}}private RecyclerView.ViewHolder findSwipedView(MotionEvent motionEvent) {final RecyclerView.LayoutManager lm = mRecyclerView.getLayoutManager();if (mActivePointerId == ACTIVE_POINTER_ID_NONE) {return null;}final int pointerIndex = motionEvent.findPointerIndex(mActivePointerId);final float dx = motionEvent.getX(pointerIndex) - mInitialTouchX;final float dy = motionEvent.getY(pointerIndex) - mInitialTouchY;final float absDx = Math.abs(dx);final float absDy = Math.abs(dy);if (absDx < mSlop && absDy < mSlop) {return null;}if (absDx > absDy && lm.canScrollHorizontally()) {return null;} else if (absDy > absDx && lm.canScrollVertically()) {return null;}View child = findChildView(motionEvent);if (child == null) {return null;}return mRecyclerView.getChildViewHolder(child);}/*** Checks whether we should select a View for swiping.*/boolean checkSelectForSwipe(int action, MotionEvent motionEvent, int pointerIndex) {if (mSelected != null || action != MotionEvent.ACTION_MOVE|| mActionState == ACTION_STATE_DRAG || !mCallback.isItemViewSwipeEnabled()) {return false;}if (mRecyclerView.getScrollState() == RecyclerView.SCROLL_STATE_DRAGGING) {return false;}final RecyclerView.ViewHolder vh = findSwipedView(motionEvent);if (vh == null) {return false;}final int movementFlags = mCallback.getAbsoluteMovementFlags(mRecyclerView, vh);final int swipeFlags = (movementFlags & ACTION_MODE_SWIPE_MASK)>> (DIRECTION_FLAG_COUNT * ACTION_STATE_SWIPE);if (swipeFlags == 0) {return false;}// mDx and mDy are only set in allowed directions. We use custom x/y here instead of// updateDxDy to avoid swiping if user moves more in the other directionfinal float x = motionEvent.getX(pointerIndex);final float y = motionEvent.getY(pointerIndex);// Calculate the distance movedfinal float dx = x - mInitialTouchX;final float dy = y - mInitialTouchY;// swipe target is chose w/o applying flags so it does not really check if swiping in that// direction is allowed. This why here, we use mDx mDy to check slope value again.final float absDx = Math.abs(dx);final float absDy = Math.abs(dy);if (absDx < mSlop && absDy < mSlop) {return false;}if (absDx > absDy) {if (dx < 0 && (swipeFlags & LEFT) == 0) {return false;}if (dx > 0 && (swipeFlags & RIGHT) == 0) {return false;}} else {if (dy < 0 && (swipeFlags & UP) == 0) {return false;}if (dy > 0 && (swipeFlags & DOWN) == 0) {return false;}}mDx = mDy = 0f;mActivePointerId = motionEvent.getPointerId(0);select(vh, ACTION_STATE_SWIPE);return true;}View findChildView(MotionEvent event) {// first check elevated views, if none, then call RVfinal float x = event.getX();final float y = event.getY();if (mSelected != null) {final View selectedView = mSelected.itemView;if (hitTest(selectedView, x, y, mSelectedStartX + mDx, mSelectedStartY + mDy, mSelected)) {return selectedView;}}for (int i = mRecoverAnimations.size() - 1; i >= 0; i--) {final WItemTouchHelperPlus.RecoverAnimation anim = mRecoverAnimations.get(i);final View view = anim.mViewHolder.itemView;boolean hitTest = hitTest(view, x, y, anim.mX, anim.mY, anim.mViewHolder);if (hitTest) {return view;}}View childViewUnder = mRecyclerView.findChildViewUnder(x, y);return childViewUnder;}/*** Starts dragging the provided ViewHolder. By default, WItemTouchHelperPlus starts a drag when a* View is long pressed. You can disable that behavior by overriding* {@link WItemTouchHelperPlus.Callback#isLongPressDragEnabled()}.* <p>* For this method to work:* <ul>* <li>The provided ViewHolder must be a child of the RecyclerView to which this* WItemTouchHelperPlus* is attached.</li>* <li>{@link WItemTouchHelperPlus.Callback} must have dragging enabled.</li>* <li>There must be a previous touch event that was reported to the WItemTouchHelperPlus* through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener* grabs previous events, this should work as expected.</li>* </ul>* <p>* For example, if you would like to let your user to be able to drag an Item by touching one* of its descendants, you may implement it as follows:* <pre>* viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {* public boolean onTouch(View v, MotionEvent event) {* if (MotionEvent.getActionMasked(event) == MotionEvent.ACTION_DOWN) {* mWItemTouchHelperPlus.startDrag(viewHolder);* }* return false;* }* });* </pre>* <p>** @param viewHolder The ViewHolder to start dragging. It must be a direct child of* RecyclerView.* @see WItemTouchHelperPlus.Callback#isItemViewSwipeEnabled()*/public void startDrag(RecyclerView.ViewHolder viewHolder) {if (!mCallback.hasDragFlag(mRecyclerView, viewHolder)) {Log.e(TAG, "Start drag has been called but dragging is not enabled");return;}if (viewHolder.itemView.getParent() != mRecyclerView) {Log.e(TAG, "Start drag has been called with a view holder which is not a child of "+ "the RecyclerView which is controlled by this WItemTouchHelperPlus.");return;}obtainVelocityTracker();mDx = mDy = 0f;select(viewHolder, ACTION_STATE_DRAG);}/*** Starts swiping the provided ViewHolder. By default, WItemTouchHelperPlus starts swiping a View* when user swipes their finger (or mouse pointer) over the View. You can disable this* behavior* by overriding {@link WItemTouchHelperPlus.Callback}* <p>* For this method to work:* <ul>* <li>The provided ViewHolder must be a child of the RecyclerView to which this* WItemTouchHelperPlus is attached.</li>* <li>{@link WItemTouchHelperPlus.Callback} must have swiping enabled.</li>* <li>There must be a previous touch event that was reported to the WItemTouchHelperPlus* through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener* grabs previous events, this should work as expected.</li>* </ul>* <p>* For example, if you would like to let your user to be able to swipe an Item by touching one* of its descendants, you may implement it as follows:* <pre>* viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {* public boolean onTouch(View v, MotionEvent event) {* if (MotionEvent.getActionMasked(event) == MotionEvent.ACTION_DOWN) {* mWItemTouchHelperPlus.startSwipe(viewHolder);* }* return false;* }* });* </pre>** @param viewHolder The ViewHolder to start swiping. It must be a direct child of* RecyclerView.*/public void startSwipe(RecyclerView.ViewHolder viewHolder) {if (!mCallback.hasSwipeFlag(mRecyclerView, viewHolder)) {Log.e(TAG, "Start swipe has been called but swiping is not enabled");return;}if (viewHolder.itemView.getParent() != mRecyclerView) {Log.e(TAG, "Start swipe has been called with a view holder which is not a child of "+ "the RecyclerView controlled by this WItemTouchHelperPlus.");return;}obtainVelocityTracker();mDx = mDy = 0f;select(viewHolder, ACTION_STATE_SWIPE);}WItemTouchHelperPlus.RecoverAnimation findAnimation(MotionEvent event) {if (mRecoverAnimations.isEmpty()) {return null;}View target = findChildView(event);for (int i = mRecoverAnimations.size() - 1; i >= 0; i--) {final WItemTouchHelperPlus.RecoverAnimation anim = mRecoverAnimations.get(i);if (anim.mViewHolder.itemView == target) {return anim;}}return null;}void updateDxDy(MotionEvent ev, int directionFlags, int pointerIndex) {final float x = ev.getX(pointerIndex);final float y = ev.getY(pointerIndex);// Calculate the distance movedmDx = x - mInitialTouchX;mDy = y - mInitialTouchY;if ((directionFlags & LEFT) == 0) {mDx = Math.max(0, mDx);}if ((directionFlags & RIGHT) == 0) {mDx = Math.min(0, mDx);}if ((directionFlags & UP) == 0) {mDy = Math.max(0, mDy);}if ((directionFlags & DOWN) == 0) {mDy = Math.min(0, mDy);}}private int swipeIfNecessary(RecyclerView.ViewHolder viewHolder) {if (mActionState == ACTION_STATE_DRAG) {return 0;}final int originalMovementFlags = mCallback.getMovementFlags(mRecyclerView, viewHolder);final int absoluteMovementFlags = mCallback.convertToAbsoluteDirection(originalMovementFlags,ViewCompat.getLayoutDirection(mRecyclerView));final int flags = (absoluteMovementFlags& ACTION_MODE_SWIPE_MASK) >> (ACTION_STATE_SWIPE * DIRECTION_FLAG_COUNT);if (flags == 0) {return 0;}final int originalFlags = (originalMovementFlags& ACTION_MODE_SWIPE_MASK) >> (ACTION_STATE_SWIPE * DIRECTION_FLAG_COUNT);int swipeDir;if (Math.abs(mDx) > Math.abs(mDy)) {if ((swipeDir = checkHorizontalSwipe(viewHolder, flags)) > 0) {// if swipe dir is not in original flags, it should be the relative directionif ((originalFlags & swipeDir) == 0) {// convert to relativereturn WItemTouchHelperPlus.Callback.convertToRelativeDirection(swipeDir,ViewCompat.getLayoutDirection(mRecyclerView));}return swipeDir;}if ((swipeDir = checkVerticalSwipe(viewHolder, flags)) > 0) {return swipeDir;}} else {if ((swipeDir = checkVerticalSwipe(viewHolder, flags)) > 0) {return swipeDir;}if ((swipeDir = checkHorizontalSwipe(viewHolder, flags)) > 0) {// if swipe dir is not in original flags, it should be the relative directionif ((originalFlags & swipeDir) == 0) {// convert to relativereturn WItemTouchHelperPlus.Callback.convertToRelativeDirection(swipeDir,ViewCompat.getLayoutDirection(mRecyclerView));}return swipeDir;}}return 0;}private int checkHorizontalSwipe(RecyclerView.ViewHolder viewHolder, int flags) {if ((flags & (LEFT | RIGHT)) != 0) {final int dirFlag = mDx > 0 ? RIGHT : LEFT;if (mVelocityTracker != null && mActivePointerId > -1) {mVelocityTracker.computeCurrentVelocity(PIXELS_PER_SECOND,mCallback.getSwipeVelocityThreshold(mMaxSwipeVelocity));final float xVelocity = mVelocityTracker.getXVelocity(mActivePointerId);final float yVelocity = mVelocityTracker.getYVelocity(mActivePointerId);final int velDirFlag = xVelocity > 0f ? RIGHT : LEFT;final float absXVelocity = Math.abs(xVelocity);if ((velDirFlag & flags) != 0 && dirFlag == velDirFlag&& absXVelocity >= mCallback.getSwipeEscapeVelocity(mSwipeEscapeVelocity)&& absXVelocity > Math.abs(yVelocity)) {return velDirFlag;}}int width = mRecyclerView.getWidth();if (viewHolder instanceof Extension && mCallback.getItemSlideType().equals(SLIDE_ITEM_TYPE_ITEMVIEW)) {Extension extension = (Extension) viewHolder;width += (int) extension.getActionWidth();}final float threshold = width * mCallback.getSwipeThreshold(viewHolder);if ((flags & dirFlag) != 0 && Math.abs(mDx) > threshold) {return dirFlag;}}return 0;}private int checkVerticalSwipe(RecyclerView.ViewHolder viewHolder, int flags) {if ((flags & (UP | DOWN)) != 0) {final int dirFlag = mDy > 0 ? DOWN : UP;if (mVelocityTracker != null && mActivePointerId > -1) {mVelocityTracker.computeCurrentVelocity(PIXELS_PER_SECOND,mCallback.getSwipeVelocityThreshold(mMaxSwipeVelocity));final float xVelocity = mVelocityTracker.getXVelocity(mActivePointerId);final float yVelocity = mVelocityTracker.getYVelocity(mActivePointerId);final int velDirFlag = yVelocity > 0f ? DOWN : UP;final float absYVelocity = Math.abs(yVelocity);if ((velDirFlag & flags) != 0 && velDirFlag == dirFlag&& absYVelocity >= mCallback.getSwipeEscapeVelocity(mSwipeEscapeVelocity)&& absYVelocity > Math.abs(xVelocity)) {return velDirFlag;}}final float threshold = mRecyclerView.getHeight() * mCallback.getSwipeThreshold(viewHolder);if ((flags & dirFlag) != 0 && Math.abs(mDy) > threshold) {return dirFlag;}}return 0;}private void addChildDrawingOrderCallback() {if (Build.VERSION.SDK_INT >= 21) {return; // we use elevation on Lollipop}if (mChildDrawingOrderCallback == null) {mChildDrawingOrderCallback = new RecyclerView.ChildDrawingOrderCallback() {@Overridepublic int onGetChildDrawingOrder(int childCount, int i) {if (mOverdrawChild == null) {return i;}int childPosition = mOverdrawChildPosition;if (childPosition == -1) {childPosition = mRecyclerView.indexOfChild(mOverdrawChild);mOverdrawChildPosition = childPosition;}if (i == childCount - 1) {return childPosition;}return i < childPosition ? i : i + 1;}};}mRecyclerView.setChildDrawingOrderCallback(mChildDrawingOrderCallback);}void removeChildDrawingOrderCallbackIfNecessary(View view) {if (view == mOverdrawChild) {mOverdrawChild = null;// only remove if we've addedif (mChildDrawingOrderCallback != null) {mRecyclerView.setChildDrawingOrderCallback(null);}}}/*** An interface which can be implemented by LayoutManager for better integration with* {@link WItemTouchHelperPlus}.*/public interface ViewDropHandler {/*** Called by the {@link WItemTouchHelperPlus} after a View is dropped over another View.* <p>* A LayoutManager should implement this interface to get ready for the upcoming move* operation.* <p>* For example, LinearLayoutManager sets up a "scrollToPositionWithOffset" calls so that* the View under drag will be used as an anchor View while calculating the next layout,* making layout stay consistent.** @param view The View which is being dragged. It is very likely that user is still* dragging this View so there might be other* {@link #prepareForDrop(View, View, int, int)} after this one.* @param target The target view which is being dropped on.* @param x The <code>left</code> offset of the View that is being dragged. This value* includes the movement caused by the user.* @param y The <code>top</code> offset of the View that is being dragged. This value* includes the movement caused by the user.*/void prepareForDrop(View view, View target, int x, int y);}/*** This class is the contract between WItemTouchHelperPlus and your application. It lets you control* which touch behaviors are enabled per each ViewHolder and also receive callbacks when user* performs these actions.* <p>* To control which actions user can take on each view, you should override* {@link #getMovementFlags(RecyclerView, RecyclerView.ViewHolder)} and return appropriate set* of direction flags. ({@link #LEFT}, {@link #RIGHT}, {@link #START}, {@link #END},* {@link #UP}, {@link #DOWN}). You can use* {@link #makeMovementFlags(int, int)} to easily construct it. Alternatively, you can use* {@link WItemTouchHelperPlus.SimpleCallback}.* <p>* If user drags an item, WItemTouchHelperPlus will call* {@link WItemTouchHelperPlus.Callback#onMove(RecyclerView, RecyclerView.ViewHolder, RecyclerView.ViewHolder)* onMove(recyclerView, dragged, target)}.* Upon receiving this callback, you should move the item from the old position* ({@code dragged.getAdapterPosition()}) to new position ({@code target.getAdapterPosition()})* in your adapter and also call {@link RecyclerView.Adapter#notifyItemMoved(int, int)}.* To control where a View can be dropped, you can override* {@link #canDropOver(RecyclerView, RecyclerView.ViewHolder, RecyclerView.ViewHolder)}. When a* dragging View overlaps multiple other views, Callback chooses the closest View with which* dragged View might have changed positions. Although this approach works for many use cases,* if you have a custom LayoutManager, you can override* {@link #chooseDropTarget(RecyclerView.ViewHolder, java.util.List, int, int)} to select a* custom drop target.* <p>* When a View is swiped, WItemTouchHelperPlus animates it until it goes out of bounds, then calls* {@link #onSwiped(RecyclerView.ViewHolder, int)}. At this point, you should update your* adapter (e.g. remove the item) and call related Adapter#notify event.*/@SuppressWarnings("UnusedParameters")public abstract static class Callback {public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200;public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250;static final int RELATIVE_DIR_FLAGS = START | END| ((START | END) << DIRECTION_FLAG_COUNT)| ((START | END) << (2 * DIRECTION_FLAG_COUNT));private static final ItemTouchUIUtil sUICallback;private static final int ABS_HORIZONTAL_DIR_FLAGS = LEFT | RIGHT| ((LEFT | RIGHT) << DIRECTION_FLAG_COUNT)| ((LEFT | RIGHT) << (2 * DIRECTION_FLAG_COUNT));private static final Interpolator sDragScrollInterpolator = new Interpolator() {@Overridepublic float getInterpolation(float t) {return t * t * t * t * t;}};private static final Interpolator sDragViewScrollCapInterpolator = new Interpolator() {@Overridepublic float getInterpolation(float t) {t -= 1.0f;return t * t * t * t * t + 1.0f;}};/*** Drag scroll speed keeps accelerating until this many milliseconds before being capped.*/private static final long DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS = 2000;private int mCachedMaxScrollSpeed = -1;static {if (Build.VERSION.SDK_INT >= 21) {sUICallback = new ItemTouchUIUtilImpl.Lollipop();} else {sUICallback = new ItemTouchUIUtilImpl.Honeycomb();}}/*** Returns the {@link ItemTouchUIUtil} that is used by the {@link WItemTouchHelperPlus.Callback} class for* visual* changes on Views in response to user interactions. {@link ItemTouchUIUtil} has different* implementations for different platform versions.* <p>* By default, {@link WItemTouchHelperPlus.Callback} applies these changes on* {@link RecyclerView.ViewHolder#itemView}.* <p>* For example, if you have a use case where you only want the text to move when user* swipes over the view, you can do the following:* <pre>* public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder){* getDefaultUIUtil().clearView(((ItemTouchViewHolder) viewHolder).textView);* }* public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {* if (viewHolder != null){* getDefaultUIUtil().onSelected(((ItemTouchViewHolder) viewHolder).textView);* }* }* public void onChildDraw(Canvas c, RecyclerView recyclerView,* RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,* boolean isCurrentlyActive) {* getDefaultUIUtil().onDraw(c, recyclerView,* ((ItemTouchViewHolder) viewHolder).textView, dX, dY,* actionState, isCurrentlyActive);* return true;* }* public void onChildDrawOver(Canvas c, RecyclerView recyclerView,* RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,* boolean isCurrentlyActive) {* getDefaultUIUtil().onDrawOver(c, recyclerView,* ((ItemTouchViewHolder) viewHolder).textView, dX, dY,* actionState, isCurrentlyActive);* return true;* }* </pre>** @return The {@link ItemTouchUIUtil} instance that is used by the {@link WItemTouchHelperPlus.Callback}*/public static ItemTouchUIUtil getDefaultUIUtil() {return sUICallback;}/*** Replaces a movement direction with its relative version by taking layout direction into* account.** @param flags The flag value that include any number of movement flags.* @param layoutDirection The layout direction of the View. Can be obtained from* {@link ViewCompat#getLayoutDirection(android.view.View)}.* @return Updated flags which uses relative flags ({@link #START}, {@link #END}) instead* of {@link #LEFT}, {@link #RIGHT}.* @see #convertToAbsoluteDirection(int, int)*/public static int convertToRelativeDirection(int flags, int layoutDirection) {int masked = flags & ABS_HORIZONTAL_DIR_FLAGS;if (masked == 0) {return flags; // does not have any abs flags, good.}flags &= ~masked; //remove left / right.if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {// no change. just OR with 2 bits shifted mask and returnflags |= masked << 2; // START is 2 bits after LEFT, END is 2 bits after RIGHT.return flags;} else {// add RIGHT flag as STARTflags |= ((masked << 1) & ~ABS_HORIZONTAL_DIR_FLAGS);// first clean RIGHT bit then add LEFT flag as ENDflags |= ((masked << 1) & ABS_HORIZONTAL_DIR_FLAGS) << 2;}return flags;}/*** Convenience method to create movement flags.* <p>* For instance, if you want to let your items be drag & dropped vertically and swiped* left to be dismissed, you can call this method with:* <code>makeMovementFlags(UP | DOWN, LEFT);</code>** @param dragFlags The directions in which the item can be dragged.* @param swipeFlags The directions in which the item can be swiped.* @return Returns an integer composed of the given drag and swipe flags.*/public static int makeMovementFlags(int dragFlags, int swipeFlags) {return makeFlag(ACTION_STATE_IDLE, swipeFlags | dragFlags)| makeFlag(ACTION_STATE_SWIPE, swipeFlags)| makeFlag(ACTION_STATE_DRAG, dragFlags);}/*** Shifts the given direction flags to the offset of the given action state.** @param actionState The action state you want to get flags in. Should be one of* {@link #ACTION_STATE_IDLE}, {@link #ACTION_STATE_SWIPE} or* {@link #ACTION_STATE_DRAG}.* @param directions The direction flags. Can be composed from {@link #UP}, {@link #DOWN},* {@link #RIGHT}, {@link #LEFT} {@link #START} and {@link #END}.* @return And integer that represents the given directions in the provided actionState.*/public static int makeFlag(int actionState, int directions) {return directions << (actionState * DIRECTION_FLAG_COUNT);}abstract int getSlideViewWidth();/*** Should return a composite flag which defines the enabled move directions in each state* (idle, swiping, dragging).* <p>* Instead of composing this flag manually, you can use {@link #makeMovementFlags(int,* int)}* or {@link #makeFlag(int, int)}.* <p>* This flag is composed of 3 sets of 8 bits, where first 8 bits are for IDLE state, next* 8 bits are for SWIPE state and third 8 bits are for DRAG state.* Each 8 bit sections can be constructed by simply OR'ing direction flags defined in* {@link WItemTouchHelperPlus}.* <p>* For example, if you want it to allow swiping LEFT and RIGHT but only allow starting to* swipe by swiping RIGHT, you can return:* <pre>* makeFlag(ACTION_STATE_IDLE, RIGHT) | makeFlag(ACTION_STATE_SWIPE, LEFT | RIGHT);* </pre>* This means, allow right movement while IDLE and allow right and left movement while* swiping.** @param recyclerView The RecyclerView to which WItemTouchHelperPlus is attached.* @param viewHolder The ViewHolder for which the movement information is necessary.* @return flags specifying which movements are allowed on this ViewHolder.* @see #makeMovementFlags(int, int)* @see #makeFlag(int, int)*/public abstract int getMovementFlags(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder);public abstract String getItemSlideType();/*** Converts a given set of flags to absolution direction which means {@link #START} and* {@link #END} are replaced with {@link #LEFT} and {@link #RIGHT} depending on the layout* direction.** @param flags The flag value that include any number of movement flags.* @param layoutDirection The layout direction of the RecyclerView.* @return Updated flags which includes only absolute direction values.*/public int convertToAbsoluteDirection(int flags, int layoutDirection) {int masked = flags & RELATIVE_DIR_FLAGS;if (masked == 0) {return flags; // does not have any relative flags, good.}flags &= ~masked; //remove start / endif (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {// no change. just OR with 2 bits shifted mask and returnflags |= masked >> 2; // START is 2 bits after LEFT, END is 2 bits after RIGHT.return flags;} else {// add START flag as RIGHTflags |= ((masked >> 1) & ~RELATIVE_DIR_FLAGS);// first clean start bit then add END flag as LEFTflags |= ((masked >> 1) & RELATIVE_DIR_FLAGS) >> 2;}return flags;}final int getAbsoluteMovementFlags(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder) {final int flags = getMovementFlags(recyclerView, viewHolder);return convertToAbsoluteDirection(flags, ViewCompat.getLayoutDirection(recyclerView));}boolean hasDragFlag(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {final int flags = getAbsoluteMovementFlags(recyclerView, viewHolder);return (flags & ACTION_MODE_DRAG_MASK) != 0;}boolean hasSwipeFlag(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder) {final int flags = getAbsoluteMovementFlags(recyclerView, viewHolder);return (flags & ACTION_MODE_SWIPE_MASK) != 0;}/*** Return true if the current ViewHolder can be dropped over the the target ViewHolder.* <p>* This method is used when selecting drop target for the dragged View. After Views are* eliminated either via bounds check or via this method, resulting set of views will be* passed to {@link #chooseDropTarget(RecyclerView.ViewHolder, java.util.List, int, int)}.* <p>* Default implementation returns true.** @param recyclerView The RecyclerView to which WItemTouchHelperPlus is attached to.* @param current The ViewHolder that user is dragging.* @param target The ViewHolder which is below the dragged ViewHolder.* @return True if the dragged ViewHolder can be replaced with the target ViewHolder, false* otherwise.*/public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current,RecyclerView.ViewHolder target) {return true;}/*** Called when WItemTouchHelperPlus wants to move the dragged item from its old position to* the new position.* <p>* If this method returns true, WItemTouchHelperPlus assumes {@code viewHolder} has been moved* to the adapter position of {@code target} ViewHolder* ({@link RecyclerView.ViewHolder#getAdapterPosition()* ViewHolder#getAdapterPosition()}).* <p>* If you don't support drag & drop, this method will never be called.** @param recyclerView The RecyclerView to which WItemTouchHelperPlus is attached to.* @param viewHolder The ViewHolder which is being dragged by the user.* @param target The ViewHolder over which the currently active item is being* dragged.* @return True if the {@code viewHolder} has been moved to the adapter position of* {@code target}.* @see #onMoved(RecyclerView, RecyclerView.ViewHolder, int, RecyclerView.ViewHolder, int, int, int)*/public abstract boolean onMove(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target);/*** Returns whether WItemTouchHelperPlus should start a drag and drop operation if an item is* long pressed.* <p>* Default value returns true but you may want to disable this if you want to start* dragging on a custom view touch using {@link #startDrag(RecyclerView.ViewHolder)}.** @return True if WItemTouchHelperPlus should start dragging an item when it is long pressed,* false otherwise. Default value is <code>true</code>.* @see #startDrag(RecyclerView.ViewHolder)*/public boolean isLongPressDragEnabled() {return true;}/*** Returns whether WItemTouchHelperPlus should start a swipe operation if a pointer is swiped* over the View.* <p>* Default value returns true but you may want to disable this if you want to start* swiping on a custom view touch using {@link #startSwipe(RecyclerView.ViewHolder)}.** @return True if WItemTouchHelperPlus should start swiping an item when user swipes a pointer* over the View, false otherwise. Default value is <code>true</code>.* @see #startSwipe(RecyclerView.ViewHolder)*/public boolean isItemViewSwipeEnabled() {return true;}/*** When finding views under a dragged view, by default, WItemTouchHelperPlus searches for views* that overlap with the dragged View. By overriding this method, you can extend or shrink* the search box.** @return The extra margin to be added to the hit box of the dragged View.*/public int getBoundingBoxMargin() {return 0;}/*** Returns the fraction that the user should move the View to be considered as swiped.* The fraction is calculated with respect to RecyclerView's bounds.* <p>* Default value is .5f, which means, to swipe a View, user must move the View at least* half of RecyclerView's width or height, depending on the swipe direction.** @param viewHolder The ViewHolder that is being dragged.* @return A float value that denotes the fraction of the View size. Default value* is .5f .*/public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {return .5f;}/*** Returns the fraction that the user should move the View to be considered as it is* dragged. After a view is moved this amount, WItemTouchHelperPlus starts checking for Views* below it for a possible drop.** @param viewHolder The ViewHolder that is being dragged.* @return A float value that denotes the fraction of the View size. Default value is* .5f .*/public float getMoveThreshold(RecyclerView.ViewHolder viewHolder) {return .5f;}/*** Defines the minimum velocity which will be considered as a swipe action by the user.* <p>* You can increase this value to make it harder to swipe or decrease it to make it easier.* Keep in mind that WItemTouchHelperPlus also checks the perpendicular velocity and makes sure* current direction velocity is larger then the perpendicular one. Otherwise, user's* movement is ambiguous. You can change the threshold by overriding* {@link #getSwipeVelocityThreshold(float)}.* <p>* The velocity is calculated in pixels per second.* <p>* The default framework value is passed as a parameter so that you can modify it with a* multiplier.** @param defaultValue The default value (in pixels per second) used by the* WItemTouchHelperPlus.* @return The minimum swipe velocity. The default implementation returns the* <code>defaultValue</code> parameter.* @see #getSwipeVelocityThreshold(float)* @see #getSwipeThreshold(RecyclerView.ViewHolder)*/public float getSwipeEscapeVelocity(float defaultValue) {return defaultValue;}/*** Defines the maximum velocity WItemTouchHelperPlus will ever calculate for pointer movements.* <p>* To consider a movement as swipe, WItemTouchHelperPlus requires it to be larger than the* perpendicular movement. If both directions reach to the max threshold, none of them will* be considered as a swipe because it is usually an indication that user rather tried to* scroll then swipe.* <p>* The velocity is calculated in pixels per second.* <p>* You can customize this behavior by changing this method. If you increase the value, it* will be easier for the user to swipe diagonally and if you decrease the value, user will* need to make a rather straight finger movement to trigger a swipe.** @param defaultValue The default value(in pixels per second) used by the WItemTouchHelperPlus.* @return The velocity cap for pointer movements. The default implementation returns the* <code>defaultValue</code> parameter.* @see #getSwipeEscapeVelocity(float)*/public float getSwipeVelocityThreshold(float defaultValue) {return defaultValue;}/*** Called by WItemTouchHelperPlus to select a drop target from the list of ViewHolders that* are under the dragged View.* <p>* Default implementation filters the View with which dragged item have changed position* in the drag direction. For instance, if the view is dragged UP, it compares the* <code>view.getTop()</code> of the two views before and after drag started. If that value* is different, the target view passes the filter.* <p>* Among these Views which pass the test, the one closest to the dragged view is chosen.* <p>* This method is called on the main thread every time user moves the View. If you want to* override it, make sure it does not do any expensive operations.** @param selected The ViewHolder being dragged by the user.* @param dropTargets The list of ViewHolder that are under the dragged View and* candidate as a drop.* @param curX The updated left value of the dragged View after drag translations* are applied. This value does not include margins added by* {@link RecyclerView.ItemDecoration}s.* @param curY The updated top value of the dragged View after drag translations* are applied. This value does not include margins added by* {@link RecyclerView.ItemDecoration}s.* @return A ViewHolder to whose position the dragged ViewHolder should be* moved to.*/public RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder selected,List<RecyclerView.ViewHolder> dropTargets, int curX, int curY) {int right = curX + selected.itemView.getWidth();int bottom = curY + selected.itemView.getHeight();RecyclerView.ViewHolder winner = null;int winnerScore = -1;final int dx = curX - selected.itemView.getLeft();final int dy = curY - selected.itemView.getTop();final int targetsSize = dropTargets.size();for (int i = 0; i < targetsSize; i++) {final RecyclerView.ViewHolder target = dropTargets.get(i);if (dx > 0) {int diff = target.itemView.getRight() - right;if (diff < 0 && target.itemView.getRight() > selected.itemView.getRight()) {final int score = Math.abs(diff);if (score > winnerScore) {winnerScore = score;winner = target;}}}if (dx < 0) {int diff = target.itemView.getLeft() - curX;if (diff > 0 && target.itemView.getLeft() < selected.itemView.getLeft()) {final int score = Math.abs(diff);if (score > winnerScore) {winnerScore = score;winner = target;}}}if (dy < 0) {int diff = target.itemView.getTop() - curY;if (diff > 0 && target.itemView.getTop() < selected.itemView.getTop()) {final int score = Math.abs(diff);if (score > winnerScore) {winnerScore = score;winner = target;}}}if (dy > 0) {int diff = target.itemView.getBottom() - bottom;if (diff < 0 && target.itemView.getBottom() > selected.itemView.getBottom()) {final int score = Math.abs(diff);if (score > winnerScore) {winnerScore = score;winner = target;}}}}return winner;}/*** Called when a ViewHolder is swiped by the user.* <p>* If you are returning relative directions ({@link #START} , {@link #END}) from the* {@link #getMovementFlags(RecyclerView, RecyclerView.ViewHolder)} method, this method* will also use relative directions. Otherwise, it will use absolute directions.* <p>* If you don't support swiping, this method will never be called.* <p>* WItemTouchHelperPlus will keep a reference to the View until it is detached from* RecyclerView.* As soon as it is detached, WItemTouchHelperPlus will call* {@link #clearView(RecyclerView, RecyclerView.ViewHolder)}.** @param viewHolder The ViewHolder which has been swiped by the user.* @param direction The direction to which the ViewHolder is swiped. It is one of* {@link #UP}, {@link #DOWN},* {@link #LEFT} or {@link #RIGHT}. If your* {@link #getMovementFlags(RecyclerView, RecyclerView.ViewHolder)}* method* returned relative flags instead of {@link #LEFT} / {@link #RIGHT};* `direction` will be relative as well. ({@link #START} or {@link* #END}).*/public abstract void onSwiped(RecyclerView.ViewHolder viewHolder, int direction);/*** Called when the ViewHolder swiped or dragged by the WItemTouchHelperPlus is changed.* <p/>* If you override this method, you should call super.** @param viewHolder The new ViewHolder that is being swiped or dragged. Might be null if* it is cleared.* @param actionState One of {@link WItemTouchHelperPlus#ACTION_STATE_IDLE},* {@link WItemTouchHelperPlus#ACTION_STATE_SWIPE} or* {@link WItemTouchHelperPlus#ACTION_STATE_DRAG}.* @see #clearView(RecyclerView, RecyclerView.ViewHolder)*/public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if (viewHolder != null) {sUICallback.onSelected(viewHolder.itemView);}}private int getMaxDragScroll(RecyclerView recyclerView) {if (mCachedMaxScrollSpeed == -1) {mCachedMaxScrollSpeed = recyclerView.getResources().getDimensionPixelSize(android.support.v7.recyclerview.R.dimen.item_touch_helper_max_drag_scroll_per_frame);}return mCachedMaxScrollSpeed;}/*** Called when {@link #onMove(RecyclerView, RecyclerView.ViewHolder, RecyclerView.ViewHolder)} returns true.* <p>* WItemTouchHelperPlus does not create an extra Bitmap or View while dragging, instead, it* modifies the existing View. Because of this reason, it is important that the View is* still part of the layout after it is moved. This may not work as intended when swapped* Views are close to RecyclerView bounds or there are gaps between them (e.g. other Views* which were not eligible for dropping over).* <p>* This method is responsible to give necessary hint to the LayoutManager so that it will* keep the View in visible area. For example, for LinearLayoutManager, this is as simple* as calling {@link LinearLayoutManager#scrollToPositionWithOffset(int, int)}.* <p>* Default implementation calls {@link RecyclerView#scrollToPosition(int)} if the View's* new position is likely to be out of bounds.* <p>* It is important to ensure the ViewHolder will stay visible as otherwise, it might be* removed by the LayoutManager if the move causes the View to go out of bounds. In that* case, drag will end prematurely.** @param recyclerView The RecyclerView controlled by the WItemTouchHelperPlus.* @param viewHolder The ViewHolder under user's control.* @param fromPos The previous adapter position of the dragged item (before it was* moved).* @param target The ViewHolder on which the currently active item has been dropped.* @param toPos The new adapter position of the dragged item.* @param x The updated left value of the dragged View after drag translations* are applied. This value does not include margins added by* {@link RecyclerView.ItemDecoration}s.* @param y The updated top value of the dragged View after drag translations* are applied. This value does not include margins added by* {@link RecyclerView.ItemDecoration}s.*/public void onMoved(final RecyclerView recyclerView,final RecyclerView.ViewHolder viewHolder, int fromPos, final RecyclerView.ViewHolder target, int toPos, int x,int y) {final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();if (layoutManager instanceof WItemTouchHelperPlus.ViewDropHandler) {((WItemTouchHelperPlus.ViewDropHandler) layoutManager).prepareForDrop(viewHolder.itemView,target.itemView, x, y);return;}// if layout manager cannot handle it, do some guessworkif (layoutManager.canScrollHorizontally()) {final int minLeft = layoutManager.getDecoratedLeft(target.itemView);if (minLeft <= recyclerView.getPaddingLeft()) {recyclerView.scrollToPosition(toPos);}final int maxRight = layoutManager.getDecoratedRight(target.itemView);if (maxRight >= recyclerView.getWidth() - recyclerView.getPaddingRight()) {recyclerView.scrollToPosition(toPos);}}if (layoutManager.canScrollVertically()) {final int minTop = layoutManager.getDecoratedTop(target.itemView);if (minTop <= recyclerView.getPaddingTop()) {recyclerView.scrollToPosition(toPos);}final int maxBottom = layoutManager.getDecoratedBottom(target.itemView);if (maxBottom >= recyclerView.getHeight() - recyclerView.getPaddingBottom()) {recyclerView.scrollToPosition(toPos);}}}void onDraw(Canvas c, RecyclerView parent, RecyclerView.ViewHolder selected,List<WItemTouchHelperPlus.RecoverAnimation> recoverAnimationList,int actionState, float dX, float dY) {final int recoverAnimSize = recoverAnimationList.size();for (int i = 0; i < recoverAnimSize; i++) {final WItemTouchHelperPlus.RecoverAnimation anim = recoverAnimationList.get(i);anim.update();final int count = c.save();onChildDraw(c, parent, anim.mViewHolder, anim.mX, anim.mY, anim.mActionState,false);c.restoreToCount(count);}if (selected != null) {final int count = c.save();onChildDraw(c, parent, selected, dX, dY, actionState, true);c.restoreToCount(count);}}void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.ViewHolder selected,List<WItemTouchHelperPlus.RecoverAnimation> recoverAnimationList,int actionState, float dX, float dY) {final int recoverAnimSize = recoverAnimationList.size();for (int i = 0; i < recoverAnimSize; i++) {final WItemTouchHelperPlus.RecoverAnimation anim = recoverAnimationList.get(i);final int count = c.save();onChildDrawOver(c, parent, anim.mViewHolder, anim.mX, anim.mY, anim.mActionState,false);c.restoreToCount(count);}if (selected != null) {final int count = c.save();onChildDrawOver(c, parent, selected, dX, dY, actionState, true);c.restoreToCount(count);}boolean hasRunningAnimation = false;for (int i = recoverAnimSize - 1; i >= 0; i--) {final WItemTouchHelperPlus.RecoverAnimation anim = recoverAnimationList.get(i);if (anim.mEnded && !anim.mIsPendingCleanup) {recoverAnimationList.remove(i);} else if (!anim.mEnded) {hasRunningAnimation = true;}}if (hasRunningAnimation) {parent.invalidate();}}/*** Called by the WItemTouchHelperPlus when the user interaction with an element is over and it* also completed its animation.* <p>* This is a good place to clear all changes on the View that was done in* {@link #onSelectedChanged(RecyclerView.ViewHolder, int)},* {@link #onChildDraw(Canvas, RecyclerView, RecyclerView.ViewHolder, float, float, int,* boolean)} or* {@link #onChildDrawOver(Canvas, RecyclerView, RecyclerView.ViewHolder, float, float, int, boolean)}.** @param recyclerView The RecyclerView which is controlled by the WItemTouchHelperPlus.* @param viewHolder The View that was interacted by the user.*/public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {sUICallback.clearView(viewHolder.itemView);}/*** Called by WItemTouchHelperPlus on RecyclerView's onDraw callback.* <p>* If you would like to customize how your View's respond to user interactions, this is* a good place to override.* <p>* Default implementation translates the child by the given <code>dX</code>,* <code>dY</code>.* WItemTouchHelperPlus also takes care of drawing the child after other children if it is being* dragged. This is done using child re-ordering mechanism. On platforms prior to L, this* is* achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L* and after, it changes View's elevation value to be greater than all other children.)** @param c The canvas which RecyclerView is drawing its children* @param recyclerView The RecyclerView to which WItemTouchHelperPlus is attached to* @param viewHolder The ViewHolder which is being interacted by the User or it was* interacted and simply animating to its original position* @param dX The amount of horizontal displacement caused by user's action* @param dY The amount of vertical displacement caused by user's action* @param actionState The type of interaction on the View. Is either {@link* #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.* @param isCurrentlyActive True if this view is currently being controlled by the user or* false it is simply animating back to its original state.* @see #onChildDrawOver(Canvas, RecyclerView, RecyclerView.ViewHolder, float, float, int,* boolean)*/public void onChildDraw(Canvas c, RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder,float dX, float dY, int actionState, boolean isCurrentlyActive) {sUICallback.onDraw(c, recyclerView, viewHolder.itemView, dX, dY, actionState,isCurrentlyActive);}/*** Called by WItemTouchHelperPlus on RecyclerView's onDraw callback.* <p>* If you would like to customize how your View's respond to user interactions, this is* a good place to override.* <p>* Default implementation translates the child by the given <code>dX</code>,* <code>dY</code>.* WItemTouchHelperPlus also takes care of drawing the child after other children if it is being* dragged. This is done using child re-ordering mechanism. On platforms prior to L, this* is* achieved via {@link android.view.ViewGroup#getChildDrawingOrder(int, int)} and on L* and after, it changes View's elevation value to be greater than all other children.)** @param c The canvas which RecyclerView is drawing its children* @param recyclerView The RecyclerView to which WItemTouchHelperPlus is attached to* @param viewHolder The ViewHolder which is being interacted by the User or it was* interacted and simply animating to its original position* @param dX The amount of horizontal displacement caused by user's action* @param dY The amount of vertical displacement caused by user's action* @param actionState The type of interaction on the View. Is either {@link* #ACTION_STATE_DRAG} or {@link #ACTION_STATE_SWIPE}.* @param isCurrentlyActive True if this view is currently being controlled by the user or* false it is simply animating back to its original state.* @see #onChildDrawOver(Canvas, RecyclerView, RecyclerView.ViewHolder, float, float, int,* boolean)*/public void onChildDrawOver(Canvas c, RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder,float dX, float dY, int actionState, boolean isCurrentlyActive) {sUICallback.onDrawOver(c, recyclerView, viewHolder.itemView, dX, dY, actionState,isCurrentlyActive);}/*** Called by the WItemTouchHelperPlus when user action finished on a ViewHolder and now the View* will be animated to its final position.* <p>* Default implementation uses ItemAnimator's duration values. If* <code>animationType</code> is {@link #ANIMATION_TYPE_DRAG}, it returns* {@link RecyclerView.ItemAnimator#getMoveDuration()}, otherwise, it returns* {@link RecyclerView.ItemAnimator#getRemoveDuration()}. If RecyclerView does not have* any {@link RecyclerView.ItemAnimator} attached, this method returns* {@code DEFAULT_DRAG_ANIMATION_DURATION} or {@code DEFAULT_SWIPE_ANIMATION_DURATION}* depending on the animation type.** @param recyclerView The RecyclerView to which the WItemTouchHelperPlus is attached to.* @param animationType The type of animation. Is one of {@link #ANIMATION_TYPE_DRAG},* {@link #ANIMATION_TYPE_SWIPE_CANCEL} or* {@link #ANIMATION_TYPE_SWIPE_SUCCESS}.* @param animateDx The horizontal distance that the animation will offset* @param animateDy The vertical distance that the animation will offset* @return The duration for the animation*/public long getAnimationDuration(RecyclerView recyclerView, int animationType,float animateDx, float animateDy) {final RecyclerView.ItemAnimator itemAnimator = recyclerView.getItemAnimator();if (itemAnimator == null) {return animationType == ANIMATION_TYPE_DRAG ? DEFAULT_DRAG_ANIMATION_DURATION: DEFAULT_SWIPE_ANIMATION_DURATION;} else {return animationType == ANIMATION_TYPE_DRAG ? itemAnimator.getMoveDuration(): itemAnimator.getRemoveDuration();}}/*** Called by the WItemTouchHelperPlus when user is dragging a view out of bounds.* <p>* You can override this method to decide how much RecyclerView should scroll in response* to this action. Default implementation calculates a value based on the amount of View* out of bounds and the time it spent there. The longer user keeps the View out of bounds,* the faster the list will scroll. Similarly, the larger portion of the View is out of* bounds, the faster the RecyclerView will scroll.** @param recyclerView The RecyclerView instance to which WItemTouchHelperPlus is* attached to.* @param viewSize The total size of the View in scroll direction, excluding* item decorations.* @param viewSizeOutOfBounds The total size of the View that is out of bounds. This value* is negative if the View is dragged towards left or top edge.* @param totalSize The total size of RecyclerView in the scroll direction.* @param msSinceStartScroll The time passed since View is kept out of bounds.* @return The amount that RecyclerView should scroll. Keep in mind that this value will* be passed to {@link RecyclerView#scrollBy(int, int)} method.*/public int interpolateOutOfBoundsScroll(RecyclerView recyclerView,int viewSize, int viewSizeOutOfBounds,int totalSize, long msSinceStartScroll) {final int maxScroll = getMaxDragScroll(recyclerView);final int absOutOfBounds = Math.abs(viewSizeOutOfBounds);final int direction = (int) Math.signum(viewSizeOutOfBounds);// might be negative if other directionfloat outOfBoundsRatio = Math.min(1f, 1f * absOutOfBounds / viewSize);final int cappedScroll = (int) (direction * maxScroll* sDragViewScrollCapInterpolator.getInterpolation(outOfBoundsRatio));final float timeRatio;if (msSinceStartScroll > DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS) {timeRatio = 1f;} else {timeRatio = (float) msSinceStartScroll / DRAG_SCROLL_ACCELERATION_LIMIT_TIME_MS;}final int value = (int) (cappedScroll * sDragScrollInterpolator.getInterpolation(timeRatio));if (value == 0) {return viewSizeOutOfBounds > 0 ? 1 : -1;}return value;}}/*** A simple wrapper to the default Callback which you can construct with drag and swipe* directions and this class will handle the flag callbacks. You should still override onMove* or* onSwiped depending on your use case.* <p>* <pre>* WItemTouchHelperPlus mIth = new WItemTouchHelperPlus(* new WItemTouchHelperPlus.SimpleCallback(WItemTouchHelperPlus.UP | WItemTouchHelperPlus.DOWN,* WItemTouchHelperPlus.LEFT) {* public abstract boolean onMove(RecyclerView recyclerView,* ViewHolder viewHolder, ViewHolder target) {* final int fromPos = viewHolder.getAdapterPosition();* final int toPos = target.getAdapterPosition();* // move item in `fromPos` to `toPos` in adapter.* return true;// true if moved, false otherwise* }* public void onSwiped(ViewHolder viewHolder, int direction) {* // remove from adapter* }* });* </pre>*/public abstract static class SimpleCallback extends WItemTouchHelperPlus.Callback {private int mDefaultSwipeDirs;private int mDefaultDragDirs;/*** Creates a Callback for the given drag and swipe allowance. These values serve as* defaults* and if you want to customize behavior per ViewHolder, you can override* {@link #getSwipeDirs(RecyclerView, RecyclerView.ViewHolder)}* and / or {@link #getDragDirs(RecyclerView, RecyclerView.ViewHolder)}.** @param dragDirs Binary OR of direction flags in which the Views can be dragged. Must be* composed of {@link #LEFT}, {@link #RIGHT}, {@link #START}, {@link* #END},* {@link #UP} and {@link #DOWN}.* @param swipeDirs Binary OR of direction flags in which the Views can be swiped. Must be* composed of {@link #LEFT}, {@link #RIGHT}, {@link #START}, {@link* #END},* {@link #UP} and {@link #DOWN}.*/public SimpleCallback(int dragDirs, int swipeDirs) {mDefaultSwipeDirs = swipeDirs;mDefaultDragDirs = dragDirs;}/*** Updates the default swipe directions. For example, you can use this method to toggle* certain directions depending on your use case.** @param defaultSwipeDirs Binary OR of directions in which the ViewHolders can be swiped.*/public void setDefaultSwipeDirs(int defaultSwipeDirs) {mDefaultSwipeDirs = defaultSwipeDirs;}/*** Updates the default drag directions. For example, you can use this method to toggle* certain directions depending on your use case.** @param defaultDragDirs Binary OR of directions in which the ViewHolders can be dragged.*/public void setDefaultDragDirs(int defaultDragDirs) {mDefaultDragDirs = defaultDragDirs;}/*** Returns the swipe directions for the provided ViewHolder.* Default implementation returns the swipe directions that was set via constructor or* {@link #setDefaultSwipeDirs(int)}.** @param recyclerView The RecyclerView to which the WItemTouchHelperPlus is attached to.* @param viewHolder The RecyclerView for which the swipe direction is queried.* @return A binary OR of direction flags.*/public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return mDefaultSwipeDirs;}/*** Returns the drag directions for the provided ViewHolder.* Default implementation returns the drag directions that was set via constructor or* {@link #setDefaultDragDirs(int)}.** @param recyclerView The RecyclerView to which the WItemTouchHelperPlus is attached to.* @param viewHolder The RecyclerView for which the swipe direction is queried.* @return A binary OR of direction flags.*/public int getDragDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return mDefaultDragDirs;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {return makeMovementFlags(getDragDirs(recyclerView, viewHolder),getSwipeDirs(recyclerView, viewHolder));}}private class WItemTouchHelperPlusGestureListener extends GestureDetector.SimpleOnGestureListener {WItemTouchHelperPlusGestureListener() {}@Overridepublic boolean onDown(MotionEvent e) {return true;}@Overridepublic void onLongPress(MotionEvent e) {View child = findChildView(e);if (child != null) {RecyclerView.ViewHolder vh = mRecyclerView.getChildViewHolder(child);if (vh != null) {if (!mCallback.hasDragFlag(mRecyclerView, vh)) {return;}int pointerId = e.getPointerId(0);// Long press is deferred.// Check w/ active pointer id to avoid selecting after motion// event is canceled.if (pointerId == mActivePointerId) {final int index = e.findPointerIndex(mActivePointerId);final float x = e.getX(index);final float y = e.getY(index);mInitialTouchX = x;mInitialTouchY = y;mDx = mDy = 0f;if (DEBUG) {Log.d(TAG,"onlong press: x:" + mInitialTouchX + ",y:" + mInitialTouchY);}if (mCallback.isLongPressDragEnabled()) {select(vh, ACTION_STATE_DRAG);}}}}}}private static class RecoverAnimation implements Animator.AnimatorListener {final float mStartDx;final float mStartDy;final float mTargetX;final float mTargetY;final RecyclerView.ViewHolder mViewHolder;final int mActionState;private final ValueAnimator mValueAnimator;final int mAnimationType;public boolean mIsPendingCleanup;float mX;float mY;// if user starts touching a recovering view, we put it into interaction mode again,// instantly.boolean mOverridden = false;boolean mEnded = false;private float mFraction;RecoverAnimation(RecyclerView.ViewHolder viewHolder, int animationType,int actionState, float startDx, float startDy, float targetX, float targetY) {mActionState = actionState;mAnimationType = animationType;mViewHolder = viewHolder;mStartDx = startDx;mStartDy = startDy;mTargetX = targetX;mTargetY = targetY;mValueAnimator = ValueAnimator.ofFloat(0f, 1f);mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {setFraction(animation.getAnimatedFraction());}});mValueAnimator.setTarget(viewHolder.itemView);mValueAnimator.addListener(this);setFraction(0f);}public void setDuration(long duration) {mValueAnimator.setDuration(duration);}public void start() {mViewHolder.setIsRecyclable(false);mValueAnimator.start();}public void cancel() {mValueAnimator.cancel();}public void setFraction(float fraction) {mFraction = fraction;}/*** We run updates on onDraw method but use the fraction from animator callback.* This way, we can sync translate x/y values w/ the animators to avoid one-off frames.*/public void update() {if (mStartDx == mTargetX) {mX = mViewHolder.itemView.getTranslationX();} else {mX = mStartDx + mFraction * (mTargetX - mStartDx);}if (mStartDy == mTargetY) {mY = mViewHolder.itemView.getTranslationY();} else {mY = mStartDy + mFraction * (mTargetY - mStartDy);}}@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {if (!mEnded) {mViewHolder.setIsRecyclable(true);}mEnded = true;}@Overridepublic void onAnimationCancel(Animator animation) {setFraction(1f); //make sure we recover the view's state.}@Overridepublic void onAnimationRepeat(Animator animation) {}} }

改進版:https://blog.csdn.net/meixi_android/article/details/84939963

總結

以上是生活随笔為你收集整理的Android侧滑删除-RecyclerView轻松实现高效的侧滑菜单的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

av在线亚洲欧洲日产一区二区 | 精品亚洲成av人在线观看 | 亚洲国产高清在线观看视频 | 欧美高清在线精品一区 | 亚洲区小说区激情区图片区 | 人妻aⅴ无码一区二区三区 | 中国大陆精品视频xxxx | 中文字幕精品av一区二区五区 | 少妇无码一区二区二三区 | 男女下面进入的视频免费午夜 | 欧美黑人巨大xxxxx | 成人性做爰aaa片免费看 | 97夜夜澡人人爽人人喊中国片 | 欧美精品国产综合久久 | 日本肉体xxxx裸交 | 亚洲日本va午夜在线电影 | 55夜色66夜色国产精品视频 | 精品夜夜澡人妻无码av蜜桃 | 国产精品无码mv在线观看 | 国产午夜视频在线观看 | 乱人伦中文视频在线观看 | 999久久久国产精品消防器材 | 强辱丰满人妻hd中文字幕 | 精品久久久无码中文字幕 | 欧美性猛交xxxx富婆 | 久久久婷婷五月亚洲97号色 | 国语自产偷拍精品视频偷 | 亚洲 高清 成人 动漫 | 亚洲精品欧美二区三区中文字幕 | 久久久久成人片免费观看蜜芽 | 97精品国产97久久久久久免费 | 亚洲精品久久久久中文第一幕 | 国产69精品久久久久app下载 | 99久久久无码国产精品免费 | 亚洲男女内射在线播放 | 国产亚洲精品久久久久久久久动漫 | 精品一区二区三区无码免费视频 | 亚洲欧洲日本无在线码 | 一本加勒比波多野结衣 | 97精品国产97久久久久久免费 | 秋霞成人午夜鲁丝一区二区三区 | 欧美自拍另类欧美综合图片区 | 中文字幕中文有码在线 | 欧美色就是色 | 妺妺窝人体色www在线小说 | 久久精品中文字幕一区 | 国精品人妻无码一区二区三区蜜柚 | 国产绳艺sm调教室论坛 | 亚洲中文字幕乱码av波多ji | 少妇性荡欲午夜性开放视频剧场 | 亚洲综合精品香蕉久久网 | 熟妇人妻激情偷爽文 | 99久久亚洲精品无码毛片 | 亚洲经典千人经典日产 | 成人精品天堂一区二区三区 | 久久综合九色综合欧美狠狠 | 色 综合 欧美 亚洲 国产 | 亚洲精品一区二区三区大桥未久 | 国产精品香蕉在线观看 | 色欲av亚洲一区无码少妇 | 无人区乱码一区二区三区 | 国产精品视频免费播放 | 日本一区二区更新不卡 | 偷窥日本少妇撒尿chinese | 熟妇人妻中文av无码 | 国产激情无码一区二区app | 欧美三级a做爰在线观看 | 日本熟妇人妻xxxxx人hd | 国产精品久免费的黄网站 | 日韩无套无码精品 | 久久五月精品中文字幕 | 国产成人无码午夜视频在线观看 | 国产偷自视频区视频 | 国产成人久久精品流白浆 | 伊人久久婷婷五月综合97色 | 亚洲熟悉妇女xxx妇女av | 成人免费无码大片a毛片 | 亚洲aⅴ无码成人网站国产app | 野外少妇愉情中文字幕 | 两性色午夜免费视频 | 欧美肥老太牲交大战 | 秋霞成人午夜鲁丝一区二区三区 | 精品成人av一区二区三区 | 婷婷六月久久综合丁香 | 国产高清不卡无码视频 | 中文字幕av无码一区二区三区电影 | 网友自拍区视频精品 | 国产婷婷色一区二区三区在线 | 久久久久久久久蜜桃 | 又大又紧又粉嫩18p少妇 | 成人精品视频一区二区 | 成人精品天堂一区二区三区 | 国产猛烈高潮尖叫视频免费 | 色妞www精品免费视频 | 精品国产麻豆免费人成网站 | 亚洲熟妇色xxxxx欧美老妇y | 曰本女人与公拘交酡免费视频 | 亚洲中文字幕无码一久久区 | 黑人粗大猛烈进出高潮视频 | 国产精品久久久久7777 | 好男人社区资源 | 思思久久99热只有频精品66 | 搡女人真爽免费视频大全 | 好屌草这里只有精品 | 俺去俺来也在线www色官网 | 国产97人人超碰caoprom | 国产精品无码永久免费888 | 日韩欧美中文字幕公布 | 国产性生交xxxxx无码 | 国产精品毛片一区二区 | 青青青手机频在线观看 | 亚洲精品中文字幕乱码 | 亚洲自偷自拍另类第1页 | 人妻尝试又大又粗久久 | 免费人成在线视频无码 | 国产无遮挡又黄又爽免费视频 | 亚洲日本va中文字幕 | 中文字幕 人妻熟女 | 久在线观看福利视频 | 亚洲の无码国产の无码影院 | 久在线观看福利视频 | 国产成人无码一二三区视频 | 国产区女主播在线观看 | 欧美大屁股xxxxhd黑色 | 少妇激情av一区二区 | 乱人伦人妻中文字幕无码久久网 | 国产精品资源一区二区 | 67194成是人免费无码 | 国产精品久久久av久久久 | 国产精品二区一区二区aⅴ污介绍 | 97色伦图片97综合影院 | 午夜精品一区二区三区的区别 | 成人无码精品1区2区3区免费看 | 久久人人爽人人人人片 | 久久99精品久久久久久 | 国产电影无码午夜在线播放 | 鲁大师影院在线观看 | 中文字幕无码日韩欧毛 | 18禁止看的免费污网站 | 国产精品久久久久久久影院 | 人人澡人人透人人爽 | 又大又硬又黄的免费视频 | 国产97人人超碰caoprom | 午夜精品久久久内射近拍高清 | 又色又爽又黄的美女裸体网站 | 久久国语露脸国产精品电影 | 久久午夜无码鲁丝片午夜精品 | 成人三级无码视频在线观看 | 中国女人内谢69xxxx | 无人区乱码一区二区三区 | 97se亚洲精品一区 | 国产精品亚洲综合色区韩国 | 无码人妻出轨黑人中文字幕 | 精品午夜福利在线观看 | 老司机亚洲精品影院无码 | 亚洲色无码一区二区三区 | 中文字幕色婷婷在线视频 | 国产免费久久久久久无码 | 欧美猛少妇色xxxxx | 成人女人看片免费视频放人 | 国产三级精品三级男人的天堂 | 亚洲成av人片在线观看无码不卡 | 特大黑人娇小亚洲女 | 国产精品沙发午睡系列 | 在线亚洲高清揄拍自拍一品区 | av无码不卡在线观看免费 | 国产av一区二区精品久久凹凸 | 夜夜高潮次次欢爽av女 | 东京无码熟妇人妻av在线网址 | 亚洲国产精品一区二区第一页 | 在线精品国产一区二区三区 | 日本免费一区二区三区最新 | 亚洲理论电影在线观看 | 无码精品国产va在线观看dvd | 荫蒂添的好舒服视频囗交 | 我要看www免费看插插视频 | 成人欧美一区二区三区黑人 | 国产精品久久久久9999小说 | 日日碰狠狠躁久久躁蜜桃 | 国产在线精品一区二区高清不卡 | 亚洲精品国产品国语在线观看 | yw尤物av无码国产在线观看 | 无遮挡啪啪摇乳动态图 | 无码成人精品区在线观看 | 亚洲码国产精品高潮在线 | 亚洲精品久久久久中文第一幕 | 久久99精品久久久久婷婷 | 国产精品二区一区二区aⅴ污介绍 | 狂野欧美性猛xxxx乱大交 | 精品国产av色一区二区深夜久久 | 麻豆人妻少妇精品无码专区 | 免费无码一区二区三区蜜桃大 | 99久久久无码国产aaa精品 | √天堂资源地址中文在线 | 人人爽人人澡人人人妻 | 亚洲中文无码av永久不收费 | 任你躁国产自任一区二区三区 | 精品无人区无码乱码毛片国产 | 美女黄网站人色视频免费国产 | 波多野结衣高清一区二区三区 | 国产成人人人97超碰超爽8 | 1000部夫妻午夜免费 | 国产乱人偷精品人妻a片 | 久久综合久久自在自线精品自 | 欧洲熟妇精品视频 | 国产在线aaa片一区二区99 | 中文字幕av日韩精品一区二区 | 国产人妻大战黑人第1集 | 色综合视频一区二区三区 | 久久精品女人的天堂av | 成人精品视频一区二区三区尤物 | 无码av中文字幕免费放 | 日韩欧美中文字幕在线三区 | 亚洲国精产品一二二线 | 国产在线精品一区二区三区直播 | 国产精品办公室沙发 | 久久精品中文闷骚内射 | 中文字幕无码乱人伦 | 久久精品女人天堂av免费观看 | 四虎永久在线精品免费网址 | 无遮挡国产高潮视频免费观看 | 欧洲vodafone精品性 | 国产av一区二区精品久久凹凸 | 国产成人精品一区二区在线小狼 | 少妇激情av一区二区 | 国产麻豆精品一区二区三区v视界 | 色欲人妻aaaaaaa无码 | 久久精品国产一区二区三区肥胖 | 中文字幕久久久久人妻 | 最近免费中文字幕中文高清百度 | aⅴ在线视频男人的天堂 | 无码国产激情在线观看 | 国产成人无码av在线影院 | 亚洲一区二区三区香蕉 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲国产午夜精品理论片 | 国产精品久免费的黄网站 | 成人一在线视频日韩国产 | av在线亚洲欧洲日产一区二区 | 人人妻在人人 | 亚洲精品久久久久久一区二区 | 国产精品对白交换视频 | 一二三四在线观看免费视频 | 国产无遮挡吃胸膜奶免费看 | 成人一区二区免费视频 | 国产特级毛片aaaaaaa高清 | 综合激情五月综合激情五月激情1 | 少妇邻居内射在线 | 夜夜躁日日躁狠狠久久av | 亚洲欧美色中文字幕在线 | 老子影院午夜精品无码 | 亚洲小说春色综合另类 | 亚洲综合伊人久久大杳蕉 | 久久精品丝袜高跟鞋 | 中文字幕精品av一区二区五区 | 久久久亚洲欧洲日产国码αv | 天天躁日日躁狠狠躁免费麻豆 | 双乳奶水饱满少妇呻吟 | 欧洲熟妇精品视频 | 精品无码一区二区三区的天堂 | 日日摸日日碰夜夜爽av | 无遮挡国产高潮视频免费观看 | 精品午夜福利在线观看 | 久久久精品成人免费观看 | 97精品人妻一区二区三区香蕉 | 欧美xxxx黑人又粗又长 | 性欧美熟妇videofreesex | 人妻熟女一区 | 国产人妻人伦精品1国产丝袜 | 色综合天天综合狠狠爱 | 鲁鲁鲁爽爽爽在线视频观看 | 久久精品国产大片免费观看 | 亚洲熟女一区二区三区 | 久久久久久久女国产乱让韩 | 午夜精品一区二区三区的区别 | 成人试看120秒体验区 | 夜先锋av资源网站 | 久久国语露脸国产精品电影 | 中文亚洲成a人片在线观看 | 熟妇女人妻丰满少妇中文字幕 | 久久人人爽人人爽人人片ⅴ | 亚洲精品一区二区三区婷婷月 | 一本久久伊人热热精品中文字幕 | 波多野结衣 黑人 | 麻豆果冻传媒2021精品传媒一区下载 | 大肉大捧一进一出视频出来呀 | 欧美精品国产综合久久 | 大肉大捧一进一出好爽视频 | 131美女爱做视频 | 西西人体www44rt大胆高清 | 在教室伦流澡到高潮hnp视频 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲综合另类小说色区 | 大屁股大乳丰满人妻 | 色婷婷久久一区二区三区麻豆 | 成人欧美一区二区三区黑人免费 | 免费网站看v片在线18禁无码 | 无码人妻av免费一区二区三区 | 国产精品99久久精品爆乳 | 欧美精品国产综合久久 | 两性色午夜免费视频 | 色综合久久久久综合一本到桃花网 | 玩弄人妻少妇500系列视频 | 久久久www成人免费毛片 | 中文字幕人成乱码熟女app | 成在人线av无码免费 | 精品无码国产自产拍在线观看蜜 | 国产精品人人爽人人做我的可爱 | 国产精品无码成人午夜电影 | 午夜精品久久久内射近拍高清 | 性做久久久久久久免费看 | 精品无码一区二区三区爱欲 | 亚洲a无码综合a国产av中文 | 天天爽夜夜爽夜夜爽 | 国产福利视频一区二区 | 久久精品一区二区三区四区 | 无码国内精品人妻少妇 | www成人国产高清内射 | 少妇被粗大的猛进出69影院 | 福利一区二区三区视频在线观看 | 伊人久久婷婷五月综合97色 | 婷婷综合久久中文字幕蜜桃三电影 | 高中生自慰www网站 | 久久99久久99精品中文字幕 | 亚欧洲精品在线视频免费观看 | 亚洲经典千人经典日产 | 玩弄少妇高潮ⅹxxxyw | 麻豆精品国产精华精华液好用吗 | 亚洲精品成人av在线 | 国产在热线精品视频 | 青青草原综合久久大伊人精品 | 人妻中文无码久热丝袜 | 丰满少妇高潮惨叫视频 | 奇米影视888欧美在线观看 | 男人的天堂2018无码 | 欧美兽交xxxx×视频 | 动漫av网站免费观看 | 精品成在人线av无码免费看 | 熟妇女人妻丰满少妇中文字幕 | 欧美一区二区三区 | 日欧一片内射va在线影院 | 人妻少妇精品久久 | 给我免费的视频在线观看 | 午夜熟女插插xx免费视频 | 人人妻人人藻人人爽欧美一区 | 国产特级毛片aaaaaaa高清 | 国产精品美女久久久 | 精品人妻人人做人人爽夜夜爽 | 亚洲日韩精品欧美一区二区 | 水蜜桃亚洲一二三四在线 | 无码人中文字幕 | 日韩精品无码一本二本三本色 | 老子影院午夜精品无码 | 强辱丰满人妻hd中文字幕 | 国产人妻人伦精品1国产丝袜 | 国产精品二区一区二区aⅴ污介绍 | 日韩精品无码免费一区二区三区 | 色情久久久av熟女人妻网站 | 丝袜 中出 制服 人妻 美腿 | 水蜜桃亚洲一二三四在线 | 亚洲熟女一区二区三区 | 国产成人无码午夜视频在线观看 | 精品久久久无码中文字幕 | 樱花草在线播放免费中文 | 无码播放一区二区三区 | 白嫩日本少妇做爰 | 2020久久香蕉国产线看观看 | 国产极品美女高潮无套在线观看 | √天堂资源地址中文在线 | 欧美变态另类xxxx | 国产精品自产拍在线观看 | 一本久久a久久精品vr综合 | 蜜臀aⅴ国产精品久久久国产老师 | 久久伊人色av天堂九九小黄鸭 | 婷婷六月久久综合丁香 | 亚洲乱码中文字幕在线 | 精品人妻中文字幕有码在线 | www国产亚洲精品久久网站 | 国产免费无码一区二区视频 | 清纯唯美经典一区二区 | 欧美性猛交xxxx富婆 | 亚洲国产日韩a在线播放 | 国产香蕉尹人综合在线观看 | 少妇性l交大片欧洲热妇乱xxx | 东北女人啪啪对白 | 中文字幕无码热在线视频 | 在线欧美精品一区二区三区 | 日本一卡二卡不卡视频查询 | 亚洲国产成人a精品不卡在线 | 免费观看激色视频网站 | 亚洲一区二区三区国产精华液 | 国内老熟妇对白xxxxhd | www成人国产高清内射 | 久久无码专区国产精品s | 国产成人一区二区三区在线观看 | 女人被男人躁得好爽免费视频 | 日韩av无码中文无码电影 | 国产免费久久精品国产传媒 | 熟妇激情内射com | 国产麻豆精品一区二区三区v视界 | 四虎永久在线精品免费网址 | 精品国产aⅴ无码一区二区 | 老子影院午夜精品无码 | 国产特级毛片aaaaaaa高清 | 久久无码中文字幕免费影院蜜桃 | 男女下面进入的视频免费午夜 | 中文字幕人妻无码一夲道 | 国产精品久久久av久久久 | 亚洲 高清 成人 动漫 | 夫妻免费无码v看片 | 伊在人天堂亚洲香蕉精品区 | 天天做天天爱天天爽综合网 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲精品久久久久久久久久久 | 天天躁日日躁狠狠躁免费麻豆 | 国产在线aaa片一区二区99 | 国产人妻人伦精品1国产丝袜 | 丰满少妇人妻久久久久久 | 天海翼激烈高潮到腰振不止 | 四虎4hu永久免费 | 国产亚洲精品久久久久久 | 成人试看120秒体验区 | 成年美女黄网站色大免费全看 | 秋霞成人午夜鲁丝一区二区三区 | 国产亚洲精品久久久闺蜜 | 国产亚洲视频中文字幕97精品 | 亚洲熟悉妇女xxx妇女av | 国产精品对白交换视频 | 欧美 日韩 亚洲 在线 | 成年美女黄网站色大免费视频 | 又大又黄又粗又爽的免费视频 | 久久99精品久久久久久 | 久久亚洲中文字幕精品一区 | 日本www一道久久久免费榴莲 | 理论片87福利理论电影 | 理论片87福利理论电影 | 黑人玩弄人妻中文在线 | 色欲人妻aaaaaaa无码 | 无遮挡啪啪摇乳动态图 | 国产亲子乱弄免费视频 | 中文字幕久久久久人妻 | 精品偷拍一区二区三区在线看 | 久久精品人人做人人综合 | 97久久精品无码一区二区 | 国产亚洲精品久久久ai换 | 兔费看少妇性l交大片免费 | 亚洲国产高清在线观看视频 | 九九久久精品国产免费看小说 | 又大又硬又爽免费视频 | 综合激情五月综合激情五月激情1 | 性色av无码免费一区二区三区 | 无码帝国www无码专区色综合 | 一区二区三区高清视频一 | 亚洲熟妇自偷自拍另类 | 18禁止看的免费污网站 | 两性色午夜免费视频 | 国产真实夫妇视频 | 亚洲人成网站免费播放 | 久久久久成人片免费观看蜜芽 | 性开放的女人aaa片 | 欧美国产日韩亚洲中文 | 曰本女人与公拘交酡免费视频 | 俺去俺来也在线www色官网 | 又色又爽又黄的美女裸体网站 | 无码国模国产在线观看 | 黑人巨大精品欧美黑寡妇 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美兽交xxxx×视频 | 亚洲熟妇色xxxxx欧美老妇 | 中文毛片无遮挡高清免费 | 国产 精品 自在自线 | 国产成人一区二区三区别 | 小sao货水好多真紧h无码视频 | 无码人妻久久一区二区三区不卡 | 永久黄网站色视频免费直播 | 女人高潮内射99精品 | 久久精品国产亚洲精品 | 久久五月精品中文字幕 | 伊人久久大香线蕉av一区二区 | 日本熟妇大屁股人妻 | 强奷人妻日本中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | 中文字幕乱码亚洲无线三区 | av香港经典三级级 在线 | 久久无码专区国产精品s | 97久久精品无码一区二区 | 人妻中文无码久热丝袜 | 亚洲国产精品无码久久久久高潮 | 国产精品人人妻人人爽 | 久久综合激激的五月天 | 亚洲毛片av日韩av无码 | 日日天干夜夜狠狠爱 | 中文字幕av伊人av无码av | 久久综合给久久狠狠97色 | 色婷婷综合中文久久一本 | 亚洲国产精品一区二区美利坚 | 国产亚洲视频中文字幕97精品 | 色窝窝无码一区二区三区色欲 | 中国女人内谢69xxxxxa片 | 亚洲成av人在线观看网址 | 麻豆av传媒蜜桃天美传媒 | 亚洲成av人片在线观看无码不卡 | 最新国产乱人伦偷精品免费网站 | 国产福利视频一区二区 | 伊人色综合久久天天小片 | 无人区乱码一区二区三区 | 国产精品久久久久久久9999 | 日韩精品无码一区二区中文字幕 | 国产成人无码午夜视频在线观看 | 国产麻豆精品精东影业av网站 | 伊人久久大香线蕉亚洲 | 亚洲s码欧洲m码国产av | 无码精品国产va在线观看dvd | 少妇性俱乐部纵欲狂欢电影 | 精品国产一区二区三区四区 | 国产精品毛片一区二区 | 波多野结衣一区二区三区av免费 | 牲欲强的熟妇农村老妇女 | 亚洲欧美日韩成人高清在线一区 | 野外少妇愉情中文字幕 | 极品尤物被啪到呻吟喷水 | 久久久久人妻一区精品色欧美 | 麻豆成人精品国产免费 | 亚洲精品欧美二区三区中文字幕 | 日韩人妻无码一区二区三区久久99 | 蜜臀av无码人妻精品 | 国产av一区二区三区最新精品 | 亚洲精品成人av在线 | 精品久久久久久人妻无码中文字幕 | 在线播放免费人成毛片乱码 | 欧美freesex黑人又粗又大 | 亚洲 欧美 激情 小说 另类 | v一区无码内射国产 | 天天摸天天碰天天添 | 日本一区二区三区免费高清 | 精品aⅴ一区二区三区 | 日本一区二区更新不卡 | 精品aⅴ一区二区三区 | 麻豆精产国品 | 国产精品无码一区二区桃花视频 | 少妇人妻大乳在线视频 | 久久99国产综合精品 | 野外少妇愉情中文字幕 | 色婷婷综合激情综在线播放 | 亚洲精品午夜无码电影网 | 日韩少妇内射免费播放 | 国产美女极度色诱视频www | 国产农村乱对白刺激视频 | 日韩人妻无码一区二区三区久久99 | 丝袜美腿亚洲一区二区 | 一本色道婷婷久久欧美 | 久久久国产精品无码免费专区 | 国产成人无码专区 | 久久精品一区二区三区四区 | 特级做a爰片毛片免费69 | 国产熟妇高潮叫床视频播放 | 国内揄拍国内精品人妻 | 一本无码人妻在中文字幕免费 | 国产成人午夜福利在线播放 | 蜜桃无码一区二区三区 | 国精产品一品二品国精品69xx | 久久久精品国产sm最大网站 | 国产在热线精品视频 | 久久久久久亚洲精品a片成人 | 久久精品国产99久久6动漫 | 精品厕所偷拍各类美女tp嘘嘘 | 国产精品美女久久久久av爽李琼 | 少妇邻居内射在线 | 久久99精品久久久久婷婷 | 亚洲国产av美女网站 | 伊在人天堂亚洲香蕉精品区 | 永久免费精品精品永久-夜色 | 图片小说视频一区二区 | 在线精品国产一区二区三区 | 青青草原综合久久大伊人精品 | 国精品人妻无码一区二区三区蜜柚 | 中文无码成人免费视频在线观看 | 超碰97人人做人人爱少妇 | 国产成人一区二区三区在线观看 | 在教室伦流澡到高潮hnp视频 | 高中生自慰www网站 | 女人被爽到呻吟gif动态图视看 | 国产精品资源一区二区 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 午夜福利不卡在线视频 | 一本大道久久东京热无码av | 国产亚洲视频中文字幕97精品 | 女人被男人躁得好爽免费视频 | 精品国偷自产在线 | 骚片av蜜桃精品一区 | 久久成人a毛片免费观看网站 | 国产明星裸体无码xxxx视频 | 国产成人久久精品流白浆 | 熟妇人妻无乱码中文字幕 | 成人影院yy111111在线观看 | 漂亮人妻洗澡被公强 日日躁 | 呦交小u女精品视频 | 少妇性l交大片 | 伊在人天堂亚洲香蕉精品区 | 日韩无套无码精品 | 在线播放免费人成毛片乱码 | 国产人妖乱国产精品人妖 | 亚洲gv猛男gv无码男同 | 欧美人与牲动交xxxx | 久久久久99精品成人片 | 欧美国产亚洲日韩在线二区 | 5858s亚洲色大成网站www | aⅴ在线视频男人的天堂 | 亚洲国产精品久久久久久 | 波多野结衣av在线观看 | 亚洲成av人片在线观看无码不卡 | 搡女人真爽免费视频大全 | 色窝窝无码一区二区三区色欲 | 国语自产偷拍精品视频偷 | 日本饥渴人妻欲求不满 | 久久久无码中文字幕久... | 少妇人妻偷人精品无码视频 | 色欲av亚洲一区无码少妇 | 国产精品久久久久久久影院 | 成人免费视频视频在线观看 免费 | 好男人社区资源 | 在线播放无码字幕亚洲 | 亚洲中文字幕无码中字 | 一本久久a久久精品vr综合 | 人妻少妇精品久久 | 骚片av蜜桃精品一区 | 在线观看国产午夜福利片 | 亚洲中文字幕va福利 | 国产疯狂伦交大片 | 久热国产vs视频在线观看 | 日本熟妇人妻xxxxx人hd | 娇妻被黑人粗大高潮白浆 | 精品少妇爆乳无码av无码专区 | 欧美性生交xxxxx久久久 | 在线成人www免费观看视频 | 日日夜夜撸啊撸 | 2019午夜福利不卡片在线 | 久久久精品欧美一区二区免费 | 麻豆人妻少妇精品无码专区 | 精品无码国产自产拍在线观看蜜 | 奇米影视7777久久精品人人爽 | 麻豆果冻传媒2021精品传媒一区下载 | 欧美黑人巨大xxxxx | 久久综合九色综合97网 | 婷婷综合久久中文字幕蜜桃三电影 | 少妇一晚三次一区二区三区 | 久久久久人妻一区精品色欧美 | 亚洲精品国产精品乱码不卡 | 在线亚洲高清揄拍自拍一品区 | 国产在线精品一区二区三区直播 | 少妇人妻偷人精品无码视频 | 乱人伦人妻中文字幕无码 | 成人动漫在线观看 | 亚洲区小说区激情区图片区 | 无码精品国产va在线观看dvd | 97精品人妻一区二区三区香蕉 | 九月婷婷人人澡人人添人人爽 | 粉嫩少妇内射浓精videos | 国产美女极度色诱视频www | 国内精品人妻无码久久久影院 | 东京无码熟妇人妻av在线网址 | 亚洲国产一区二区三区在线观看 | 色噜噜亚洲男人的天堂 | 精品日本一区二区三区在线观看 | 国产av无码专区亚洲a∨毛片 | 高潮毛片无遮挡高清免费 | 图片小说视频一区二区 | 天下第一社区视频www日本 | 97色伦图片97综合影院 | 美女毛片一区二区三区四区 | 无套内射视频囯产 | 亚洲一区二区三区国产精华液 | 97色伦图片97综合影院 | 天天av天天av天天透 | 97久久精品无码一区二区 | 蜜桃视频韩日免费播放 | 国产又爽又黄又刺激的视频 | 国产成人无码午夜视频在线观看 | 日韩欧美成人免费观看 | 精品夜夜澡人妻无码av蜜桃 | 久久精品人人做人人综合 | 日本丰满护士爆乳xxxx | 国产口爆吞精在线视频 | 国产精品沙发午睡系列 | 性欧美熟妇videofreesex | 少妇高潮一区二区三区99 | 无码国产激情在线观看 | 纯爱无遮挡h肉动漫在线播放 | 精品国产麻豆免费人成网站 | 国产婷婷色一区二区三区在线 | 牲欲强的熟妇农村老妇女 | 亚洲国产精品一区二区第一页 | 午夜福利试看120秒体验区 | 狠狠色欧美亚洲狠狠色www | 亚洲国产高清在线观看视频 | 国产精品爱久久久久久久 | 久久综合九色综合97网 | 久久久久国色av免费观看性色 | 成人精品视频一区二区三区尤物 | 成人女人看片免费视频放人 | 18禁止看的免费污网站 | 激情亚洲一区国产精品 | 欧美丰满少妇xxxx性 | 久久综合网欧美色妞网 | 麻豆av传媒蜜桃天美传媒 | 国产农村乱对白刺激视频 | 午夜免费福利小电影 | 亚洲国产日韩a在线播放 | 免费观看黄网站 | 美女极度色诱视频国产 | 久久精品女人天堂av免费观看 | 免费国产黄网站在线观看 | 久久亚洲国产成人精品性色 | 久久精品无码一区二区三区 | 亚洲中文字幕无码中字 | 鲁鲁鲁爽爽爽在线视频观看 | 无码吃奶揉捏奶头高潮视频 | 久久久久av无码免费网 | 精品国产一区二区三区四区在线看 | 色婷婷综合激情综在线播放 | 十八禁真人啪啪免费网站 | 亚洲精品国产精品乱码视色 | 国产三级久久久精品麻豆三级 | 日本护士毛茸茸高潮 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲综合无码一区二区三区 | 999久久久国产精品消防器材 | 欧美日韩综合一区二区三区 | 国产人妻精品一区二区三区 | 狠狠综合久久久久综合网 | 帮老师解开蕾丝奶罩吸乳网站 | 成在人线av无码免观看麻豆 | 久久综合狠狠综合久久综合88 | 国产香蕉尹人视频在线 | 又大又硬又黄的免费视频 | 亚洲国产午夜精品理论片 | 麻豆精品国产精华精华液好用吗 | 中文字幕中文有码在线 | 熟妇人妻无乱码中文字幕 | 久久成人a毛片免费观看网站 | 国产午夜无码精品免费看 | 夜夜高潮次次欢爽av女 | 欧美日韩色另类综合 | 噜噜噜亚洲色成人网站 | 无码一区二区三区在线观看 | 亚洲熟悉妇女xxx妇女av | a国产一区二区免费入口 | 国产午夜亚洲精品不卡 | 牲欲强的熟妇农村老妇女 | 一本久久a久久精品亚洲 | 欧美人与动性行为视频 | 国产激情精品一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品亚洲一区二区三区喷水 | 熟妇人妻中文av无码 | 日本爽爽爽爽爽爽在线观看免 | 色窝窝无码一区二区三区色欲 | 高清不卡一区二区三区 | 三上悠亚人妻中文字幕在线 | 亚洲a无码综合a国产av中文 | 老熟妇仑乱视频一区二区 | 四虎影视成人永久免费观看视频 | 亚洲日韩av片在线观看 | 骚片av蜜桃精品一区 | 亚洲无人区午夜福利码高清完整版 | 中文字幕乱妇无码av在线 | 亚洲欧美日韩综合久久久 | 曰本女人与公拘交酡免费视频 | 呦交小u女精品视频 | 丰满人妻翻云覆雨呻吟视频 | 最近中文2019字幕第二页 | 久久无码中文字幕免费影院蜜桃 | 中文字幕亚洲情99在线 | 97夜夜澡人人爽人人喊中国片 | 欧美精品无码一区二区三区 | 久久久久久久久蜜桃 | 国产在线精品一区二区高清不卡 | 天天躁日日躁狠狠躁免费麻豆 | 免费观看的无遮挡av | 国产办公室秘书无码精品99 | 熟女少妇在线视频播放 | 亚洲の无码国产の无码影院 | 国产乱码精品一品二品 | 国产精品免费大片 | 国产成人无码av片在线观看不卡 | 日韩人妻系列无码专区 | 亚洲精品一区二区三区在线观看 | 我要看www免费看插插视频 | 亚洲中文字幕在线观看 | 午夜精品久久久久久久久 | 亚洲の无码国产の无码步美 | 久久综合久久自在自线精品自 | 波多野结衣高清一区二区三区 | 欧美 亚洲 国产 另类 | 久久久久亚洲精品中文字幕 | 少妇愉情理伦片bd | 国产两女互慰高潮视频在线观看 | 图片区 小说区 区 亚洲五月 | 亚洲人成无码网www | 亚洲成a人片在线观看日本 | 国内精品一区二区三区不卡 | 人人爽人人澡人人人妻 | 3d动漫精品啪啪一区二区中 | 真人与拘做受免费视频 | 成人性做爰aaa片免费看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 老子影院午夜伦不卡 | 成人无码影片精品久久久 | 中文字幕无码av激情不卡 | 精品国产麻豆免费人成网站 | 波多野结衣一区二区三区av免费 | 最近的中文字幕在线看视频 | 免费人成在线观看网站 | 亚洲成a人一区二区三区 | 丝袜美腿亚洲一区二区 | 久久国产精品二国产精品 | 成人av无码一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 中文字幕乱码人妻二区三区 | 亚洲欧美中文字幕5发布 | 国产精品无码永久免费888 | 少妇太爽了在线观看 | 午夜精品久久久久久久久 | 亚洲精品一区二区三区四区五区 | 亚洲一区二区三区国产精华液 | 欧美精品一区二区精品久久 | 久久精品中文闷骚内射 | 欧美国产日产一区二区 | 狂野欧美激情性xxxx | 中文字幕无码av波多野吉衣 | 国产又爽又黄又刺激的视频 | 亚洲人成无码网www | 国产亚洲美女精品久久久2020 | 国产超级va在线观看视频 | 国产精品二区一区二区aⅴ污介绍 | 国产va免费精品观看 | 无码av中文字幕免费放 | 日本一区二区三区免费播放 | 无码国产色欲xxxxx视频 | 国产午夜无码视频在线观看 | 久久久亚洲欧洲日产国码αv | 捆绑白丝粉色jk震动捧喷白浆 | 天干天干啦夜天干天2017 | 久久精品人人做人人综合试看 | 国产精品福利视频导航 | 5858s亚洲色大成网站www | 国产亚洲精品久久久久久大师 | 日本精品人妻无码免费大全 | 亚洲s码欧洲m码国产av | 性色欲情网站iwww九文堂 | 久久久无码中文字幕久... | 麻豆国产97在线 | 欧洲 | 成人性做爰aaa片免费看 | 99riav国产精品视频 | 日日摸日日碰夜夜爽av | 高清国产亚洲精品自在久久 | 亚洲va中文字幕无码久久不卡 | 特黄特色大片免费播放器图片 | 久久综合给久久狠狠97色 | 成人精品视频一区二区三区尤物 | 日韩亚洲欧美精品综合 | 领导边摸边吃奶边做爽在线观看 | 久久久久亚洲精品男人的天堂 | 中文字幕无码免费久久9一区9 | 日本熟妇人妻xxxxx人hd | 红桃av一区二区三区在线无码av | 奇米影视888欧美在线观看 | 国产人妻精品一区二区三区不卡 | 欧美 亚洲 国产 另类 | 男女猛烈xx00免费视频试看 | 67194成是人免费无码 | 一本久久a久久精品vr综合 | 成熟女人特级毛片www免费 | 免费男性肉肉影院 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕乱码中文乱码51精品 | 欧美 日韩 亚洲 在线 | 51国偷自产一区二区三区 | 久久久无码中文字幕久... | 中文毛片无遮挡高清免费 | 成人免费无码大片a毛片 | 大肉大捧一进一出好爽视频 | 国产亚洲精品久久久ai换 | 亚洲男人av天堂午夜在 | 蜜桃视频插满18在线观看 | 丰满护士巨好爽好大乳 | 久热国产vs视频在线观看 | 亚洲人成网站在线播放942 | 日本欧美一区二区三区乱码 | 无码人妻少妇伦在线电影 | 国内精品九九久久久精品 | 18禁止看的免费污网站 | 无码午夜成人1000部免费视频 | 永久免费观看美女裸体的网站 | 欧美日韩综合一区二区三区 | 全黄性性激高免费视频 | 少妇无码吹潮 | 久久www免费人成人片 | 欧美日韩久久久精品a片 | 久久久久成人片免费观看蜜芽 | 亚洲熟妇自偷自拍另类 | www国产亚洲精品久久网站 | 色欲人妻aaaaaaa无码 | 国产特级毛片aaaaaa高潮流水 | 国产激情无码一区二区 | 久久精品女人的天堂av | 欧美xxxx黑人又粗又长 | 精品久久8x国产免费观看 | 麻豆国产97在线 | 欧洲 | 奇米影视7777久久精品 | 久久综合狠狠综合久久综合88 | 性做久久久久久久免费看 | 亚洲欧洲日本综合aⅴ在线 | 精品国产乱码久久久久乱码 | 久久久中文久久久无码 | 欧美熟妇另类久久久久久多毛 | 妺妺窝人体色www婷婷 | 人妻尝试又大又粗久久 | 成人一在线视频日韩国产 | 亚洲伊人久久精品影院 | 天下第一社区视频www日本 | 午夜熟女插插xx免费视频 | 偷窥日本少妇撒尿chinese | 131美女爱做视频 | 亚洲第一网站男人都懂 | 东京热一精品无码av | 日日天干夜夜狠狠爱 | 国内精品人妻无码久久久影院蜜桃 | 亚洲一区二区三区国产精华液 | 男女猛烈xx00免费视频试看 | 欧美日韩视频无码一区二区三 | 麻豆国产丝袜白领秘书在线观看 | 久久久久久亚洲精品a片成人 | 娇妻被黑人粗大高潮白浆 | 日本熟妇人妻xxxxx人hd | 少妇性荡欲午夜性开放视频剧场 | 国产sm调教视频在线观看 | 日本肉体xxxx裸交 | 国产熟妇另类久久久久 | 国产欧美亚洲精品a | 爆乳一区二区三区无码 | 狠狠色色综合网站 | 国内丰满熟女出轨videos | 亚洲精品无码人妻无码 | 麻豆国产丝袜白领秘书在线观看 | 夜夜躁日日躁狠狠久久av | 99久久精品无码一区二区毛片 | 色婷婷欧美在线播放内射 | 88国产精品欧美一区二区三区 | 精品aⅴ一区二区三区 | 人妻夜夜爽天天爽三区 | 日韩无码专区 | 精品国产一区二区三区四区在线看 | 丰满人妻被黑人猛烈进入 | 特级做a爰片毛片免费69 | 国产亚洲美女精品久久久2020 | 亚洲va中文字幕无码久久不卡 | 国色天香社区在线视频 | 亚洲欧洲日本无在线码 | 中文字幕人妻无码一夲道 | 亚洲熟妇自偷自拍另类 | 2019午夜福利不卡片在线 | 亚洲精品一区二区三区婷婷月 | 男人的天堂2018无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲成a人片在线观看无码3d | 亚洲呦女专区 | 一本无码人妻在中文字幕免费 | 三上悠亚人妻中文字幕在线 | 亚洲精品中文字幕久久久久 | 老司机亚洲精品影院无码 | 丰腴饱满的极品熟妇 | 国产99久久精品一区二区 | 无码国产激情在线观看 | 中文字幕亚洲情99在线 | 久久精品国产精品国产精品污 | 少妇性l交大片欧洲热妇乱xxx | 一本色道久久综合亚洲精品不卡 | 成人aaa片一区国产精品 | 内射后入在线观看一区 | 国产精品久久福利网站 | 人人妻人人澡人人爽人人精品浪潮 | 欧美野外疯狂做受xxxx高潮 | 奇米影视888欧美在线观看 | 福利一区二区三区视频在线观看 | 午夜无码区在线观看 | 丝袜 中出 制服 人妻 美腿 | 九九热爱视频精品 | 国产熟妇高潮叫床视频播放 | 天天躁日日躁狠狠躁免费麻豆 | 牲交欧美兽交欧美 | 亚洲欧洲日本无在线码 | 香蕉久久久久久av成人 | 亚无码乱人伦一区二区 | 麻豆国产人妻欲求不满谁演的 | 无码国内精品人妻少妇 | 天堂а√在线中文在线 | 无套内射视频囯产 | 欧美日韩人成综合在线播放 | 精品国产福利一区二区 | 日韩在线不卡免费视频一区 | 亚洲精品国产品国语在线观看 | 国产人妻久久精品二区三区老狼 | 色诱久久久久综合网ywww | 久久久久99精品国产片 | 乱码午夜-极国产极内射 | 亚洲中文无码av永久不收费 | 精品国偷自产在线 | 免费无码午夜福利片69 | 偷窥村妇洗澡毛毛多 | 成人无码影片精品久久久 | 日韩人妻系列无码专区 | 最新国产乱人伦偷精品免费网站 | 一本色道婷婷久久欧美 | 亚洲日韩精品欧美一区二区 | 亚洲综合精品香蕉久久网 | 伊人久久婷婷五月综合97色 | 国产小呦泬泬99精品 | 久久精品国产日本波多野结衣 | 国产麻豆精品一区二区三区v视界 | 澳门永久av免费网站 | 亚洲 高清 成人 动漫 | 中文字幕无码热在线视频 | 精品成人av一区二区三区 | 精品国产国产综合精品 | 国产精品沙发午睡系列 | 日韩欧美群交p片內射中文 | 国产深夜福利视频在线 | 内射后入在线观看一区 | 中文字幕无码视频专区 | 波多野结衣乳巨码无在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 在线精品亚洲一区二区 | 亚洲爆乳精品无码一区二区三区 | 欧美日韩在线亚洲综合国产人 | 日本成熟视频免费视频 | 一本加勒比波多野结衣 | 国产欧美精品一区二区三区 | 免费国产成人高清在线观看网站 | 99久久久无码国产精品免费 | 日韩视频 中文字幕 视频一区 | 亚洲人成网站在线播放942 | 精品无人国产偷自产在线 | 无码av中文字幕免费放 | 国产亚洲精品久久久ai换 | 小sao货水好多真紧h无码视频 | 我要看www免费看插插视频 | 极品嫩模高潮叫床 | 亚洲最大成人网站 | 欧美精品在线观看 | 波多野结衣aⅴ在线 | 在线播放免费人成毛片乱码 | 欧美日韩久久久精品a片 | 好屌草这里只有精品 | 久久久久国色av免费观看性色 | 日本爽爽爽爽爽爽在线观看免 | 99riav国产精品视频 | 性做久久久久久久免费看 | 免费播放一区二区三区 | 亚洲日本va午夜在线电影 | 牲欲强的熟妇农村老妇女视频 | 97资源共享在线视频 | 欧美野外疯狂做受xxxx高潮 | 荡女精品导航 | 国内丰满熟女出轨videos | 无套内谢老熟女 | 欧美 丝袜 自拍 制服 另类 | 少妇太爽了在线观看 | 国产性生交xxxxx无码 | 国产一精品一av一免费 | 午夜精品一区二区三区的区别 | 精品无码一区二区三区爱欲 | 无套内谢的新婚少妇国语播放 | 国产97人人超碰caoprom | 亚洲成av人在线观看网址 | 亚洲综合伊人久久大杳蕉 | 狠狠综合久久久久综合网 | 亚洲精品久久久久中文第一幕 | 国产热a欧美热a在线视频 | 丰满诱人的人妻3 | 无人区乱码一区二区三区 | 狠狠色丁香久久婷婷综合五月 | 日韩欧美成人免费观看 | 精品久久久无码中文字幕 | 日韩人妻无码中文字幕视频 | 国产人成高清在线视频99最全资源 | 黑人巨大精品欧美一区二区 | 九月婷婷人人澡人人添人人爽 | 欧美日韩色另类综合 | 自拍偷自拍亚洲精品被多人伦好爽 | 日本大乳高潮视频在线观看 | 高潮喷水的毛片 | 一本久道久久综合狠狠爱 | 性生交片免费无码看人 | 亚洲国产精品成人久久蜜臀 | 欧美国产日韩亚洲中文 | 精品国偷自产在线视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 欧美熟妇另类久久久久久多毛 | 樱花草在线社区www | 日日橹狠狠爱欧美视频 | 亚洲成av人影院在线观看 | 色婷婷综合激情综在线播放 | 欧美成人免费全部网站 | 亚洲精品午夜国产va久久成人 | 中文字幕 亚洲精品 第1页 | 亚洲s色大片在线观看 | 国产熟妇另类久久久久 | 澳门永久av免费网站 | 免费观看激色视频网站 | 亚洲小说图区综合在线 | 97资源共享在线视频 | 在线播放免费人成毛片乱码 | 蜜桃av抽搐高潮一区二区 | 久久99精品久久久久久动态图 | 久久国产精品精品国产色婷婷 | 国产真实伦对白全集 | 特级做a爰片毛片免费69 | 日日天干夜夜狠狠爱 | 中文精品久久久久人妻不卡 | 日本在线高清不卡免费播放 | 亚洲小说图区综合在线 | 国产亚洲精品久久久久久久 | 国产猛烈高潮尖叫视频免费 | 国产精品第一国产精品 | 久久久久亚洲精品男人的天堂 | 国产一区二区三区精品视频 | a片免费视频在线观看 | 国产精品久久久久久久9999 | 狠狠躁日日躁夜夜躁2020 | 在线观看免费人成视频 | 在线观看国产午夜福利片 | 国产精品丝袜黑色高跟鞋 | 精品夜夜澡人妻无码av蜜桃 | 精品国产乱码久久久久乱码 | 青草视频在线播放 | 亚洲狠狠婷婷综合久久 | 人人妻人人澡人人爽人人精品 | 国产极品视觉盛宴 | 国产精品久久久久无码av色戒 | 久久亚洲中文字幕无码 | 亚洲日韩av片在线观看 | 免费网站看v片在线18禁无码 | 熟妇女人妻丰满少妇中文字幕 | 亚洲综合色区中文字幕 | 麻豆果冻传媒2021精品传媒一区下载 | 国产国语老龄妇女a片 | 欧美日韩亚洲国产精品 | 精品国精品国产自在久国产87 | 欧美激情综合亚洲一二区 | 精品久久久久久人妻无码中文字幕 | 亚洲熟熟妇xxxx | 精品成人av一区二区三区 | 色妞www精品免费视频 | 无码帝国www无码专区色综合 | 日日天日日夜日日摸 | 国产真实乱对白精彩久久 | 小鲜肉自慰网站xnxx | 三级4级全黄60分钟 | 亚洲精品中文字幕久久久久 | 久久综合狠狠综合久久综合88 | 欧美第一黄网免费网站 | 2020最新国产自产精品 | 久久久精品成人免费观看 | 久久zyz资源站无码中文动漫 | 强伦人妻一区二区三区视频18 | 两性色午夜免费视频 | 国产亚洲精品久久久闺蜜 | 亚洲国产日韩a在线播放 | 天下第一社区视频www日本 | 88国产精品欧美一区二区三区 | 免费网站看v片在线18禁无码 | 无码av最新清无码专区吞精 | 伊人色综合久久天天小片 | 97夜夜澡人人双人人人喊 | 成人一区二区免费视频 | 日本一区二区三区免费播放 | 最新国产乱人伦偷精品免费网站 | 欧美成人午夜精品久久久 | 亚洲欧洲中文日韩av乱码 | 欧美 日韩 亚洲 在线 | 性啪啪chinese东北女人 | 国产情侣作爱视频免费观看 | 女人高潮内射99精品 | 国产精品久免费的黄网站 | 一个人看的www免费视频在线观看 | 大肉大捧一进一出好爽视频 | 精品一区二区三区无码免费视频 | 精品久久8x国产免费观看 | 少妇高潮一区二区三区99 | 天堂在线观看www | 亚洲综合无码久久精品综合 | 九九久久精品国产免费看小说 | 久久精品国产99久久6动漫 | 亚洲а∨天堂久久精品2021 | 一区二区三区高清视频一 | 曰本女人与公拘交酡免费视频 | 国产激情艳情在线看视频 | 欧美freesex黑人又粗又大 | 高潮喷水的毛片 | 国产亲子乱弄免费视频 | 国产内射爽爽大片视频社区在线 | 一本加勒比波多野结衣 | 日日噜噜噜噜夜夜爽亚洲精品 | 日韩精品无码免费一区二区三区 | 国产av无码专区亚洲a∨毛片 | 欧美人与禽zoz0性伦交 | 蜜桃臀无码内射一区二区三区 | 精品一区二区不卡无码av | 性欧美大战久久久久久久 | 高清不卡一区二区三区 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲人成影院在线观看 | 国产sm调教视频在线观看 | 久在线观看福利视频 | 久久婷婷五月综合色国产香蕉 | 国产午夜精品一区二区三区嫩草 | 免费无码av一区二区 | 国产av人人夜夜澡人人爽麻豆 | 国产人成高清在线视频99最全资源 | 亚洲欧美综合区丁香五月小说 | 丁香花在线影院观看在线播放 | 国产深夜福利视频在线 | 激情内射亚州一区二区三区爱妻 | 久久天天躁狠狠躁夜夜免费观看 | 色妞www精品免费视频 | 久久综合九色综合97网 | 日本va欧美va欧美va精品 | 97人妻精品一区二区三区 | 一个人看的视频www在线 | 东京无码熟妇人妻av在线网址 | 日本精品高清一区二区 | 亚洲国产欧美国产综合一区 | 精品久久8x国产免费观看 | 学生妹亚洲一区二区 | 牲交欧美兽交欧美 | 亚洲区小说区激情区图片区 | 曰本女人与公拘交酡免费视频 | 欧美老人巨大xxxx做受 | 乱人伦人妻中文字幕无码久久网 | 男人和女人高潮免费网站 | 天堂无码人妻精品一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 亚洲国产成人av在线观看 | 国产人妖乱国产精品人妖 | 久久精品国产99久久6动漫 | 粉嫩少妇内射浓精videos | 亚洲精品无码国产 | 国产精品久久国产精品99 | 国产69精品久久久久app下载 | 亚欧洲精品在线视频免费观看 | 国产av无码专区亚洲awww | 日韩亚洲欧美中文高清在线 | 国产深夜福利视频在线 | аⅴ资源天堂资源库在线 | 一二三四社区在线中文视频 | 风流少妇按摩来高潮 | 99麻豆久久久国产精品免费 | 丰满人妻一区二区三区免费视频 | 欧美日韩精品 | 超碰97人人做人人爱少妇 | 成人女人看片免费视频放人 | 美女张开腿让人桶 | 亚洲日韩精品欧美一区二区 | 亚洲va中文字幕无码久久不卡 | 免费中文字幕日韩欧美 | 精品水蜜桃久久久久久久 | 国产在线精品一区二区高清不卡 | 亚洲欧美综合区丁香五月小说 | 国产乱子伦视频在线播放 | 精品久久久久香蕉网 | 大地资源中文第3页 | 亚洲热妇无码av在线播放 | 久久aⅴ免费观看 | 麻花豆传媒剧国产免费mv在线 | 亚洲人成网站在线播放942 | 精品国产精品久久一区免费式 | 一本色道婷婷久久欧美 | 黑人大群体交免费视频 | 国产电影无码午夜在线播放 | 无遮无挡爽爽免费视频 | 乌克兰少妇性做爰 | 玩弄中年熟妇正在播放 | 正在播放东北夫妻内射 | 日日鲁鲁鲁夜夜爽爽狠狠 | ass日本丰满熟妇pics | 欧美午夜特黄aaaaaa片 | a在线亚洲男人的天堂 | 久久熟妇人妻午夜寂寞影院 | 欧洲精品码一区二区三区免费看 | 青青青手机频在线观看 | 久久午夜无码鲁丝片午夜精品 | 久久亚洲日韩精品一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 人人妻人人藻人人爽欧美一区 | 又大又硬又爽免费视频 | 免费国产成人高清在线观看网站 | 成人综合网亚洲伊人 | 天堂亚洲2017在线观看 | 九月婷婷人人澡人人添人人爽 | 久久精品女人天堂av免费观看 | 日本又色又爽又黄的a片18禁 | 国产午夜福利亚洲第一 | 亚洲人亚洲人成电影网站色 | 少妇无码av无码专区在线观看 | 久久久www成人免费毛片 | 伊人久久大香线焦av综合影院 | 欧美黑人乱大交 | 亚洲精品国产精品乱码不卡 | 青青久在线视频免费观看 | 亚洲 欧美 激情 小说 另类 | 亚洲日韩av一区二区三区中文 | 97se亚洲精品一区 | 丝袜足控一区二区三区 | 玩弄人妻少妇500系列视频 | 亚洲欧美综合区丁香五月小说 | 国产极品视觉盛宴 | 亚洲精品一区二区三区在线 | 精品乱子伦一区二区三区 | 亚洲乱码中文字幕在线 | 色欲人妻aaaaaaa无码 | 欧美老熟妇乱xxxxx | 久久久久久国产精品无码下载 | 国产亚洲精品久久久久久 | 成人无码精品1区2区3区免费看 | 亚洲s码欧洲m码国产av | 国产片av国语在线观看 | 久久 国产 尿 小便 嘘嘘 | 国产熟妇高潮叫床视频播放 | 国产99久久精品一区二区 | 亚洲成a人一区二区三区 | 亚洲啪av永久无码精品放毛片 | a在线亚洲男人的天堂 | 中文字幕 亚洲精品 第1页 | 欧美亚洲日韩国产人成在线播放 | 亚洲色欲色欲欲www在线 | 国产成人午夜福利在线播放 | 国产一区二区三区四区五区加勒比 | 性色av无码免费一区二区三区 | 俺去俺来也www色官网 | 日韩精品无码一本二本三本色 | 99精品视频在线观看免费 | 强开小婷嫩苞又嫩又紧视频 | 成人无码精品一区二区三区 | 精品人妻av区 | 日韩 欧美 动漫 国产 制服 | av无码不卡在线观看免费 | 久久精品丝袜高跟鞋 | 99久久婷婷国产综合精品青草免费 | 午夜精品一区二区三区在线观看 | 奇米影视7777久久精品人人爽 | aⅴ在线视频男人的天堂 | 激情国产av做激情国产爱 | 亚洲精品一区二区三区在线观看 | 亚洲国产午夜精品理论片 | av人摸人人人澡人人超碰下载 | 久久综合久久自在自线精品自 | 人妻少妇精品视频专区 | 中文字幕人妻丝袜二区 | 亚洲国产精品一区二区美利坚 | 18无码粉嫩小泬无套在线观看 | 好屌草这里只有精品 | 日日麻批免费40分钟无码 | 色 综合 欧美 亚洲 国产 | 波多野42部无码喷潮在线 | 亚洲人成影院在线观看 | 性史性农村dvd毛片 | 无码人妻黑人中文字幕 | 一本色道久久综合亚洲精品不卡 | 男女猛烈xx00免费视频试看 | 午夜精品一区二区三区在线观看 | 国产亚洲精品久久久久久大师 | 欧洲熟妇色 欧美 | 久久精品国产大片免费观看 | 女人和拘做爰正片视频 | 亚洲无人区一区二区三区 | 无码人妻av免费一区二区三区 | 欧美老人巨大xxxx做受 | 丁香花在线影院观看在线播放 | 欧美真人作爱免费视频 | 国内精品人妻无码久久久影院蜜桃 | 黑人巨大精品欧美一区二区 | 又色又爽又黄的美女裸体网站 | 少妇性l交大片欧洲热妇乱xxx | 欧美日本免费一区二区三区 | 国产精品无码成人午夜电影 | 特大黑人娇小亚洲女 | 国产精品美女久久久久av爽李琼 | 色综合视频一区二区三区 | 高清国产亚洲精品自在久久 | 亚洲中文字幕乱码av波多ji | 午夜精品一区二区三区的区别 | 波多野42部无码喷潮在线 | 国产片av国语在线观看 | 丰满妇女强制高潮18xxxx | 国产精品高潮呻吟av久久4虎 | 中文字幕无码日韩欧毛 | 久久精品国产一区二区三区 | 国产成人精品必看 | 日本熟妇大屁股人妻 | 亚洲区小说区激情区图片区 | 中文精品无码中文字幕无码专区 | 久激情内射婷内射蜜桃人妖 | 国产亚av手机在线观看 | 色综合久久久无码中文字幕 | 强奷人妻日本中文字幕 | 狠狠色欧美亚洲狠狠色www | 日韩精品久久久肉伦网站 | 久久精品国产精品国产精品污 | 国产色视频一区二区三区 | 俺去俺来也www色官网 | 人妻少妇精品视频专区 | 国产成人综合美国十次 | 欧美 亚洲 国产 另类 | www国产精品内射老师 | 久久精品成人欧美大片 | 狠狠噜狠狠狠狠丁香五月 | 中文字幕av伊人av无码av | 日本精品人妻无码免费大全 | 成人免费无码大片a毛片 | 亚洲中文字幕无码一久久区 | 色婷婷综合中文久久一本 | 国产精品第一区揄拍无码 | 精品一区二区三区波多野结衣 | 特级做a爰片毛片免费69 | 青青青手机频在线观看 | 国产三级久久久精品麻豆三级 | 永久免费精品精品永久-夜色 | 成人影院yy111111在线观看 | 丰满少妇高潮惨叫视频 | 九九久久精品国产免费看小说 | 我要看www免费看插插视频 | 成年美女黄网站色大免费视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品国产a久久久久久 | 免费人成网站视频在线观看 | 高潮喷水的毛片 | 亚欧洲精品在线视频免费观看 | 在线观看欧美一区二区三区 | 宝宝好涨水快流出来免费视频 | 久久人妻内射无码一区三区 | aa片在线观看视频在线播放 | 在线欧美精品一区二区三区 | 日日碰狠狠丁香久燥 | 无码成人精品区在线观看 | 永久免费观看国产裸体美女 | 4hu四虎永久在线观看 | 日韩人妻少妇一区二区三区 | 亚洲精品一区二区三区四区五区 | 国产三级久久久精品麻豆三级 | 亚洲日韩中文字幕在线播放 | 成人欧美一区二区三区黑人 | 一二三四社区在线中文视频 | 国产尤物精品视频 | 成人无码视频在线观看网站 | 国产精品-区区久久久狼 | 鲁大师影院在线观看 | 无码免费一区二区三区 | 九月婷婷人人澡人人添人人爽 | 日本丰满熟妇videos | 国产无套粉嫩白浆在线 | 人人爽人人爽人人片av亚洲 | 99久久久无码国产精品免费 | 国产精品va在线观看无码 | 国产女主播喷水视频在线观看 | 国产精品国产三级国产专播 | 3d动漫精品啪啪一区二区中 | 久久精品人人做人人综合试看 | 日韩精品乱码av一区二区 | 亚洲一区二区三区播放 | 欧洲vodafone精品性 | 国产成人综合色在线观看网站 | 欧美人与禽猛交狂配 | 成熟女人特级毛片www免费 | 美女扒开屁股让男人桶 | 国产精品a成v人在线播放 | aⅴ亚洲 日韩 色 图网站 播放 | 成人免费视频视频在线观看 免费 | 国产在线aaa片一区二区99 | 国产精品久久精品三级 | 国产婷婷色一区二区三区在线 | 亚洲色偷偷偷综合网 | 日本肉体xxxx裸交 | 丝袜人妻一区二区三区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 性欧美疯狂xxxxbbbb | 女人高潮内射99精品 | 国产精品第一国产精品 | 国内少妇偷人精品视频 | 久久国产劲爆∧v内射 | 人妻少妇精品无码专区二区 | 国产成人综合在线女婷五月99播放 | 亚洲国产精品久久久久久 | 玩弄中年熟妇正在播放 | 天干天干啦夜天干天2017 | 国产色视频一区二区三区 | 牲欲强的熟妇农村老妇女 | 日日麻批免费40分钟无码 | 人妻中文无码久热丝袜 | 丁香花在线影院观看在线播放 | 国产精品国产三级国产专播 | 国产超碰人人爽人人做人人添 | 国内揄拍国内精品少妇国语 | 在线 国产 欧美 亚洲 天堂 | 婷婷五月综合缴情在线视频 | 国产农村乱对白刺激视频 | 亚洲s码欧洲m码国产av | 午夜福利试看120秒体验区 | 99久久无码一区人妻 | 久9re热视频这里只有精品 | 日本www一道久久久免费榴莲 | 欧美变态另类xxxx | 欧美人与牲动交xxxx | 国产av剧情md精品麻豆 | 又大又硬又黄的免费视频 | 丝袜美腿亚洲一区二区 | 久久国产精品二国产精品 | 婷婷丁香六月激情综合啪 | 99久久精品无码一区二区毛片 | 在线精品国产一区二区三区 | 国产超碰人人爽人人做人人添 | 99久久99久久免费精品蜜桃 | 天堂无码人妻精品一区二区三区 | 女人被男人躁得好爽免费视频 | 中文字幕无码免费久久99 | 性生交大片免费看l | 亚洲精品国产品国语在线观看 | 国产香蕉尹人综合在线观看 | 最近中文2019字幕第二页 | аⅴ资源天堂资源库在线 | 狠狠噜狠狠狠狠丁香五月 | 丰满肥臀大屁股熟妇激情视频 | 精品国产成人一区二区三区 | 国产 浪潮av性色四虎 | 兔费看少妇性l交大片免费 | 国产精品99久久精品爆乳 | 日产精品99久久久久久 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产成人无码专区 | 亚洲精品中文字幕久久久久 | 国产精品久久久午夜夜伦鲁鲁 | 精品国产av色一区二区深夜久久 | 色综合久久中文娱乐网 | 无码一区二区三区在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲中文字幕无码中文字在线 | 无套内谢的新婚少妇国语播放 | 亚洲热妇无码av在线播放 | 熟女少妇在线视频播放 | 欧美35页视频在线观看 | 日本一区二区三区免费播放 | 玩弄少妇高潮ⅹxxxyw | 熟女体下毛毛黑森林 | а√资源新版在线天堂 | 激情内射亚州一区二区三区爱妻 | 亚洲综合另类小说色区 | 国产成人一区二区三区在线观看 | 疯狂三人交性欧美 | 国产欧美亚洲精品a | 亚洲色欲久久久综合网东京热 | 亚洲娇小与黑人巨大交 | 国产精品久久久久久无码 | 久久99热只有频精品8 | 久久午夜无码鲁丝片秋霞 | 久久综合九色综合97网 | 人人妻人人澡人人爽欧美一区九九 | 中文字幕日产无线码一区 | 高中生自慰www网站 | 色窝窝无码一区二区三区色欲 | 久久久国产一区二区三区 | 欧美大屁股xxxxhd黑色 | 国产成人精品久久亚洲高清不卡 | 亚洲狠狠婷婷综合久久 | 在教室伦流澡到高潮hnp视频 | 久久精品人人做人人综合 | 牛和人交xxxx欧美 | 亚洲中文无码av永久不收费 | 97se亚洲精品一区 | 日韩视频 中文字幕 视频一区 | 日日摸天天摸爽爽狠狠97 | 55夜色66夜色国产精品视频 | 中文字幕av日韩精品一区二区 | 午夜成人1000部免费视频 | 亚洲乱亚洲乱妇50p | 久久久久亚洲精品中文字幕 | 97人妻精品一区二区三区 | 四虎国产精品免费久久 | 日本一区二区三区免费高清 | av人摸人人人澡人人超碰下载 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕无线码免费人妻 | 国产真实乱对白精彩久久 | 亚洲精品中文字幕 | 日韩无套无码精品 | 国产超碰人人爽人人做人人添 | 国产人妖乱国产精品人妖 | 欧美日韩色另类综合 | 人妻有码中文字幕在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 精品少妇爆乳无码av无码专区 | 无码任你躁久久久久久久 | 国产绳艺sm调教室论坛 | 精品欧美一区二区三区久久久 | 亚洲高清偷拍一区二区三区 | 婷婷色婷婷开心五月四房播播 | 精品成人av一区二区三区 | 乌克兰少妇性做爰 | 国产麻豆精品一区二区三区v视界 | 精品国偷自产在线视频 | 一个人免费观看的www视频 | 国产香蕉97碰碰久久人人 | 欧美一区二区三区视频在线观看 | 中文字幕乱码中文乱码51精品 | 日日摸日日碰夜夜爽av | 国产成人无码午夜视频在线观看 | 欧美刺激性大交 | 少妇高潮一区二区三区99 | 一本一道久久综合久久 | 成 人 免费观看网站 | 精品国产青草久久久久福利 | 东京一本一道一二三区 | 免费男性肉肉影院 | 又大又紧又粉嫩18p少妇 | 国产亚洲精品久久久久久大师 | 午夜精品一区二区三区的区别 | 日本欧美一区二区三区乱码 | 全黄性性激高免费视频 | 国产亚洲精品精品国产亚洲综合 | 动漫av网站免费观看 | 亚洲狠狠婷婷综合久久 | 国产精品无码一区二区三区不卡 | 丝袜美腿亚洲一区二区 | 日本va欧美va欧美va精品 | 性色欲网站人妻丰满中文久久不卡 | 乱人伦人妻中文字幕无码久久网 | 丰满人妻一区二区三区免费视频 | 4hu四虎永久在线观看 | 网友自拍区视频精品 | 爽爽影院免费观看 | 1000部夫妻午夜免费 | ass日本丰满熟妇pics | 久久99精品国产.久久久久 | 国产成人精品视频ⅴa片软件竹菊 | 牲交欧美兽交欧美 | 国产成人一区二区三区在线观看 | 久久99精品国产麻豆蜜芽 | 欧美国产亚洲日韩在线二区 | 久久精品国产99久久6动漫 | 无码精品国产va在线观看dvd | 亚洲日韩中文字幕在线播放 | 东京无码熟妇人妻av在线网址 | 女高中生第一次破苞av | 亚洲色偷偷偷综合网 | 在线看片无码永久免费视频 | 欧美性生交xxxxx久久久 | 无码人妻av免费一区二区三区 | 亚洲色在线无码国产精品不卡 | 丰满诱人的人妻3 | a片在线免费观看 | 色一情一乱一伦一视频免费看 | 国产精品无码久久av | 暴力强奷在线播放无码 | 亚洲欧美日韩综合久久久 | 领导边摸边吃奶边做爽在线观看 | 99久久久国产精品无码免费 | 无码人妻丰满熟妇区毛片18 | 精品国产福利一区二区 | 午夜理论片yy44880影院 | 99在线 | 亚洲 | 国产成人一区二区三区在线观看 | 99久久无码一区人妻 | 精品亚洲韩国一区二区三区 | 亚洲人成影院在线无码按摩店 | 国产亚洲美女精品久久久2020 | 在线播放免费人成毛片乱码 |