精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Recyclerview_helper多功能封裝,讓你的應用更加自如

移動開發 Android
RecyclerView作為列表使用,在項目中的應用場景實在是太普遍了。針對項目應用,主要使用了RecyclerView的單或多類型Item,點擊/長按事件,ItemAnimator動畫效果以及上拉加載、下拉刷新。recyclerview_helper就是針對以上應用場景進行的封裝與使用,避免在項目使用中重復的敲代碼以及依賴多個庫或者自定義實現等復雜方式。

前言

RecyclerView作為列表使用,在項目中的應用場景實在是太普遍了。針對項目應用,主要使用了RecyclerView的單或多類型Item,點擊/長按事件,ItemAnimator動畫效果以及上拉加載、下拉刷新。recyclerview_helper就是針對以上應用場景進行的封裝與使用,避免在項目使用中重復的敲代碼以及依賴多個庫或者自定義實現等復雜方式。

介紹

 

如上所示,recyclerview_helper針對不同應用場景封裝了不同的功能。

具體功能如下:

1.封裝了ViewHolder以及Adapter,避免每次都要重復寫創建ViewHolder以及重寫onCreateViewHolder,onBindViewHolder方法,支持單/多類型Item。

2.封裝了OnItemClickListener以及OnItemLongClickListener,不必每次寫接口,定義回調。僅支持對Item的點擊事件。

3.具有各種炫酷的動畫效果,功能裝飾者模式封裝Adapter添加初始化動畫效果 ,以及自定義ItemAnimator實現各種炫酷的Item增刪動畫效果。

4.支持添加頭尾布局,以及支持下拉刷新和上拉加載更多功能。同時支持自定義下拉刷新布局及動畫,以及上拉加載更多的布局,可實現各種炫酷效果,跟隨你的想象放飛。

使用

1.添加依賴

①.在項目的 build.gradle 文件中添加

  1. allprojects { 
  2.         repositories { 
  3.             ... 
  4.             maven { url 'https://jitpack.io' } 
  5.         } 
  6.     }  

②.在 module 的 build.gradle 文件中添加依賴

  1. dependencies { 
  2.  
  3.     compile 'com.github.LRH1993:recyclerview_helper:V1.0.3' 
  4.  
  5.  

2.單/多類型Item使用

 

 

單類型

  1. CommonAdapter<String> mAdapter = new CommonAdapter<String>(this, R.layout.item_common, mDatas) {             
  2.                  @Override 
  3.             public void convert(BaseViewHolder holder, int position) { 
  4.                 holder.setText(R.id.tv_content,mDatas.get(position));                 
  5.                         int number = new Random().nextInt(3); 
  6.                 holder.setImageResource(R.id.iv_content,mImageRes[number]); 
  7.             } 
  8.         }; 
  9.         mRecyclerView.setAdapter(mAdapter);  

通過實現CommonAdapter,傳入context,布局以及數據,然后實現convert方法,設置view的顯示數據就完成了。很簡潔方便。

多類型

  1. MultiItemTypeSupport<String> support = new MultiItemTypeSupport<String>() {             
  2.                  @Override 
  3.             public int getLayoutId(int itemType) {                 
  4.                  if (itemType == TYPE_HEAD) {                     
  5.                      return R.layout.item_special; 
  6.                 } else {                     
  7.                      return R.layout.item_common; 
  8.                 } 
  9.  
  10.             }             
  11.             @Override 
  12.             public int getItemViewType(int position, String s) {                 
  13.                  if (position%3==0&& position>0) {                     
  14.                      return TYPE_HEAD; 
  15.                 } else {                     
  16.                    return TYPE_COMMON; 
  17.                 } 
  18.             } 
  19.         }; 
  20. ----------------------------------------------------------------------------------------------------------------------------- 
  21.  MultiItemCommonAdapter<String> mAdapter = new MultiItemCommonAdapter<String>(this, mDatas, support) {             
  22.             @Override 
  23.             public void convert(BaseViewHolder holder, int position) {                 
  24.                                  if (position%3==0&& position>0) { 
  25.                     holder.setImageResource(R.id.iv_head,R.drawable.multi_image); 
  26.                 } else { 
  27.                     holder.setText(R.id.tv_content,mDatas.get(position));                     
  28.                                  int number = new Random().nextInt(3)+3; 
  29.                     holder.setImageResource(R.id.iv_content,mImageRes[number]); 
  30.                 } 
  31.             } 
  32.         }; 
  33.         mRecyclerView.setAdapter(mAdapter);  

和單類型的區別就是需要實現MultiItemTypeSupport,在MultiItemCommonAdapter對象中傳入實現的該對象,該對象完成兩個方法,功能是通過類型判別Item布局以及通過位置和數據判斷返回類型。通過這個對象,避免我們在Adapter中進行類別判斷的書寫。

該部分實現參考了鴻洋大神對RecyclerView的封裝。

3.事件監聽使用

 

事件監聽的使用就比較簡單了,和正常使用一樣。

  1. adapter.setOnItemClickListener(new CommonAdapter.OnItemClickListener() {             
  2.                 @Override 
  3.             public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) { 
  4.                 System.out.println("點擊"); 
  5.                 showMyDialog("響應點擊事件"); 
  6.             } 
  7.         }); 
  8.         adapter.setOnItemLongClickListener(new CommonAdapter.OnItemLongClickListener() {             
  9.                  @Override 
  10.             public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) { 
  11.                 showMyDialog("響應長按事件");                 
  12.                         return false
  13.             } 
  14.         });  

4.動畫使用

 

 

gif錄制效果不太明顯,實際手機上看著效果還是不錯的。

  1. mRecyclerView.setItemAnimator(new LandingAnimator()); 
  2.         ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(adapter); 
  3.         scaleAdapter.setFirstOnly(false); 
  4.         scaleAdapter.setDuration(500); 
  5.         mRecyclerView.setAdapter(scaleAdapter);  

動畫效果分兩種:

第一種:adapter初始化item的動畫效果

第二種:ItemAnimator定義的動畫效果

第一種動畫效果使用了裝飾者模式,需要再封裝一層,然后通過setAdapter添加進去。

第二種直接和平時使用一樣。

除此之外,ItemAnimator還有以下高級功能:

設置動畫時長

  1. mRecyclerView.getItemAnimator().setAddDuration(1000); 
  2. mRecyclerView.getItemAnimator().setRemoveDuration(1000); 
  3. mRecyclerView.getItemAnimator().setMoveDuration(1000); 
  4. mRecyclerView.getItemAnimator().setChangeDuration(1000);  

插值器

  1. SlideInLeftAnimator animator = new SlideInLeftAnimator(); 
  2.  
  3. animator.setInterpolator(new OvershootInterpolator()); 
  4.  
  5. mRecyclerView.setItemAnimator(animator);  

也可以通過自定義AnimateViewHolder實現類,實現其他動畫效果。

Adapter也有一些高級功能:

動畫時長

  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); 
  2. alphaAdapter.setDuration(1000); 
  3. mRecyclerView.setAdapter(alphaAdapter);  

插值器

  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); 
  2.  
  3. alphaAdapter.setInterpolator(new OvershootInterpolator()); 
  4.  
  5. mRecyclerView.setAdapter(alphaAdapter);  

是否僅顯示一次動畫效果

  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); 
  2.  
  3. scaleAdapter.setFirstOnly(false); 
  4.  
  5. recyclerView.setAdapter(alphaAdapter);  

設置成true,則動畫效果只在第一次創建Item使用,設置成false,則每次上下滑動都帶動畫效果。

復雜情況下,可以設置成true。

復合動畫

  1. AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); 
  2. recyclerView.setAdapter(new ScaleInAnimationAdapter(alphaAdapter));  

recyclerview_helper中已經自定義了各種動畫效果,如果有好的實現動畫,可以通過自定義實現。

 

該部分實現參考了recyclerview-animators這個動畫庫。

5.添加頭/尾布局

 

 

自定義頭/尾布局,隨意添加。

  1. View headView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_head,null,false); 
  2.  
  3. View footView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_foot,null,false); 
  4.  
  5. mRecyclerView.addHeaderView(headView); 
  6.  
  7. mRecyclerView.addFooterView(footView);  

幾行代碼搞定。

6.下拉刷新/上拉加載 

 

布局設置

  1. <com.lvr.library.recyclerview.HRecyclerView 
  2.         app:loadMoreEnabled="true" 
  3.         app:loadMoreFooterLayout="@layout/layout_hrecyclerview_load_more_footer" 
  4.         app:refreshEnabled="true" 
  5.         app:refreshHeaderLayout="@layout/layout_hrecyclerview_refresh_header" 
  6.         android:id="@+id/list" 
  7.         android:layout_width="match_parent" 
  8.         android:layout_height="match_parent"/>  

其中頭/尾布局需要自定義View實現。在例子中已經分別實現了一種

[[197979]] 

如果想實現不同的加載圖片以及動畫效果,可以對比實現。

首先設置監聽

  1. mRecyclerView.setOnRefreshListener(this); 
  2.  
  3. mRecyclerView.setOnLoadMoreListener(this);  

實現回調方法

  1. @Override 
  2.     public void onLoadMore() {         
  3.              if(mLoadMoreFooterView.canLoadMore()){ 
  4.             mLoadMoreFooterView.setStatus(LoadMoreFooterView.Status.LOADING);             
  5.                  new Thread(new Runnable() {                 
  6.                       @Override 
  7.                 public void run() {                     
  8.                              //假裝加載耗時數據 
  9.                     SystemClock.sleep(1000); 
  10.                     Message message = Message.obtain(); 
  11.                     message.what =count
  12.                     count++; 
  13.                     mHandler.sendMessage(message); 
  14.                 } 
  15.             }).start(); 
  16.         } 
  17.  
  18.     }     
  19.      @Override 
  20.     public void onRefresh() {         
  21.          new Thread(new Runnable() {             
  22.                  @Override 
  23.             public void run() {                 
  24.                      //假裝加載耗時數據 
  25.                 SystemClock.sleep(1000); 
  26.                 Message msg = Message.obtain(); 
  27.                 msg.what=0; 
  28.                 mHandler.sendMessage(msg); 
  29.             } 
  30.         }).start(); 
  31.  
  32.     }  

開啟刷新/關閉刷新

  1. mRecyclerView.setRefreshing(true); 

根據不同情況設置不同加載狀態:

  1. //正在加載 
  2.  
  3. mLoadMoreFooterView.setStatus(LoadMoreFooterView.Status.LOADING); //沒有更多數據mLoadMoreFooterView.setStatus(LoadMoreFooterView.Status.THE_END);//加載完畢mLoadMoreFooterView.setStatus(LoadMoreFooterView.Status.GONE);//出現錯誤mLoadMoreFooterView.setStatus(LoadMoreFooterView.Status.ERROR); 

出現錯誤,還可以通過實現onRetry方法,實現再次加載。

以上兩部分效果參考了IRecyclerView實現。

原理

上面介紹了使用,那么下面就介紹下實現原理,如果需要自定義實現,可以參考完成。

1.ViewHolder及Adapter封裝

針對ViewHolder的功能:實現View緩存,避免重復findViewById,進行封裝。針對Adapter在實際項目中重復書寫onCreateViewHolder,onBindViewHolder方法,進行封裝處理。

ViewHolder

  1. private SparseArray<View> viewArray;     
  2.    private View mItemView;     
  3.    /** 
  4.     * 構造ViewHolder 
  5.     * 
  6.     * @param parent 父類容器 
  7.     * @param resId  布局資源文件id 
  8.     */ 
  9.    public BaseViewHolder(Context context, ViewGroup parent, @LayoutRes int resId) {         
  10.        super(LayoutInflater.from(context).inflate(resId, parent, false)); 
  11.        viewArray = new SparseArray<>(); 
  12.    }     
  13.     /** 
  14.     * 獲取ItemView 
  15.     * @return ItemView 
  16.     */ 
  17.     public View getItemView(){          
  18.            return this.itemView; 
  19.     }     
  20.      /** 
  21.     * 獲取布局中的View 
  22.     * 
  23.     * @param viewId view的Id 
  24.     * @param <T>    View的類型 
  25.     * @return view 
  26.     */ 
  27.    public <T extends View> T getView(@IdRes int viewId) { 
  28.        View view = viewArray.get(viewId);         
  29.    if (view == null) { 
  30.            view = itemView.findViewById(viewId); 
  31.            viewArray.put(viewId, view); 
  32.        }        return (T) view
  33.    }  

將View存放在集合類中,進行緩存,getView方法可以在Adapter中直接調用,避免每次創建不同類型的ViewHolder,一個BaseViewHolder搞定一切情況。

Adapter

基類CommonAdapter

  1. public abstract class CommonAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {     
  2.     protected Context mContext;     
  3.     protected int mLayoutId;     
  4.     protected List<T> mDatas;     
  5.     protected OnItemClickListener mOnItemClickListener;     
  6.     protected OnItemLongClickListener mOnItemLongClickListener;     
  7.     public CommonAdapter(Context context, int layoutId, List<T> datas) 
  8.     { 
  9.         mContext = context; 
  10.         mLayoutId = layoutId; 
  11.         mDatas = datas; 
  12.     }     
  13.       @Override 
  14.     public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         
  15.             final BaseViewHolder viewHolder = new BaseViewHolder(mContext,parent,mLayoutId);         
  16.                 return viewHolder; 
  17.     }     
  18.       @Override 
  19.     public void onBindViewHolder(final BaseViewHolder holder, final int position) { 
  20.         convert(holder, position); 
  21.     }    public abstract void convert(BaseViewHolder holder, int position);     
  22.       @Override 
  23.     public int getItemCount() {         
  24.             return mDatas.size(); 
  25.     } 
  26. .........  

封裝實現onCreateViewHolder方法,并把convert方法抽象出去,實現數據綁定工作。使得結構簡單。

針對多類型情況,需要判斷類型,設置不同布局,所以需要個幫助類:

  1. public interface MultiItemTypeSupport<T>{ 
  2.  
  3. int getLayoutId(int itemType); 
  4. int getItemViewType(int position, T t); 
  5.  
  6.  

剩下來基礎CommonAdapter實現MultiItemCommonAdapter來應對多類型Item。

  1. public abstract class MultiItemCommonAdapter<T> extends CommonAdapter<T>{     
  2.     protected MultiItemTypeSupport<T> mMultiItemTypeSupport;     
  3.     public MultiItemCommonAdapter(Context context, List<T> datas, 
  4.         MultiItemTypeSupport<T> multiItemTypeSupport) 
  5.     {    super(context, -1, datas); 
  6.         mMultiItemTypeSupport = multiItemTypeSupport; 
  7.     }     
  8.      @Override 
  9.     public int getItemViewType(int position) 
  10.     {         
  11.             return mMultiItemTypeSupport.getItemViewType(position, mDatas.get(position)); 
  12.     }     
  13.      @Override 
  14.     public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
  15.     {         
  16.             int layoutId = mMultiItemTypeSupport.getLayoutId(viewType); 
  17.          BaseViewHolder holder = new BaseViewHolder(mContext, parent, layoutId);         
  18.             return holder; 
  19.     } 
  20.  

整個實現很簡單,但是效果不錯。關于事件點擊監聽,很簡單,就不介紹了。

2.動畫效果實現

先介紹個簡單的,Adapter的動畫效果:

  1. @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
  2.    mAdapter.onBindViewHolder(holder, position);     
  3.         int adapterPosition = holder.getAdapterPosition();     
  4.         if (!isFirstOnly || adapterPosition > mLastPosition) {       
  5.             for (Animator anim : getAnimators(holder.itemView)) { 
  6.            anim.setDuration(mDuration).start(); 
  7.            anim.setInterpolator(mInterpolator); 
  8.      } 
  9.      mLastPosition = adapterPosition; 
  10.    } else { 
  11.      ViewHelper.clear(holder.itemView); 
  12.    } 
  13.  }  

其實就是實現一個包裝類AnimationAdapter,在其中onBindViewHolder方法中添加了動畫效果。

下面繼續介紹ItemAnimator的實現。關于這部分實現,實際代碼比較長。就簡要介紹下實現主要流程,具體實現可以看下這篇文章:recyclerview-animators,讓你的RecyclerView與眾不同。

其實RecyclerView中已經為我們默認提供了Item動畫效果,就是通過這個類:DefaultItemAnimator,而這個類又從哪來?

  1. public class DefaultItemAnimator extends SimpleItemAnimator 

搞清楚源頭,那么我們也可以 比照著進行實現動畫效果,所以通過繼承SimpleItemAnimator實現自定義動畫類。

主要針對對animateRemove, animateAdd, animateMove, animateChange 這4個方法的實現,增加數據增、刪、動、改的動畫效果。

3.頭布局/尾布局實現

其實頭布局,尾布局的添加和上面實現Adapter動畫效果的方式一致,都是通過裝飾者模式。

因為下面要實現上拉加載/下拉刷新,所以這兩部分布局也像添加.頭布局/尾布局一樣實現。

先定義一個WrapperAdapter。

  1. @Override 
  2.    public int getItemCount() {         
  3.         return mAdapter.getItemCount() + 4; 
  4.    }     
  5.     @Override 
  6.    public int getItemViewType(int position) {         
  7.         if (position == 0) {             
  8.                  return REFRESH_HEADER; 
  9.        } else if (position == 1) {             
  10.                  return HEADER; 
  11.        } else if (1 < position && position < mAdapter.getItemCount() + 2) {            return mAdapter.getItemViewType(position - 2); 
  12.        } else if (position == mAdapter.getItemCount() + 2) {            return FOOTER; 
  13.        } else if (position == mAdapter.getItemCount() + 3) {            return LOAD_MORE_FOOTER; 
  14.        }         
  15.                 throw new IllegalArgumentException("Wrong type! Position = " + position); 
  16.    }     
  17.     @Override 
  18.    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == REFRESH_HEADER) {            return new RefreshHeaderContainerViewHolder(mRefreshHeaderContainer); 
  19.        } else if (viewType == HEADER) {             
  20.                 return new HeaderContainerViewHolder(mHeaderContainer); 
  21.        } else if (viewType == FOOTER) {             
  22.                 return new FooterContainerViewHolder(mFooterContainer); 
  23.        } else if (viewType == LOAD_MORE_FOOTER) {             
  24.                 return new LoadMoreFooterContainerViewHolder(mLoadMoreFooterContainer); 
  25.        } else {             
  26.                 return mAdapter.onCreateViewHolder(parent, viewType); 
  27.        } 
  28.    }     
  29.     @Override 
  30.    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if (1 < position && position < mAdapter.getItemCount() + 2) { 
  31.            mAdapter.onBindViewHolder(holder, position - 2); 
  32.        } 
  33.    } 

主要是針對上拉加載/下拉刷新,頭布局/尾布局進行特殊處理。

其次,由于上面四部分都要獨占一行,在LinearLayoutManager下沒問題,但是在StaggeredGridLayoutManager以及GridLayoutManager要特殊處理。

GridLayoutManager

  1. @Overridepublic void onAttachedToRecyclerView(final RecyclerView recyclerView) { 
  2.     RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();         
  3.           if (layoutManager instanceof GridLayoutManager) {             
  4.                final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;             
  5.                final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup(); 
  6.            gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {                 
  7.                       @Override 
  8.                 public int getSpanSize(int position) { 
  9.                     WrapperAdapter wrapperAdapter = (WrapperAdapter) recyclerView.getAdapter();                     
  10.                             if (isFullSpanType(wrapperAdapter.getItemViewType(position))) {                         
  11.                                     return gridLayoutManager.getSpanCount(); 
  12.                     } else if (spanSizeLookup != null) {                         
  13.                                     return spanSizeLookup.getSpanSize(position - 2); 
  14.                     }                     
  15.                                 return 1; 
  16.                 } 
  17.             }); 
  18.         } 
  19.     }  

StaggeredGridLayoutManager

  1. @Override 
  2.  public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {         
  3.        super.onViewAttachedToWindow(holder);         
  4.        int position = holder.getAdapterPosition();         
  5.        int type = getItemViewType(position);         
  6.             if (isFullSpanType(type)) { 
  7.            ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();             
  8.                    if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { 
  9.                 StaggeredGridLayoutManager.LayoutParams lp = (StaggeredGridLayoutManager.LayoutParams) layoutParams; 
  10.                 lp.setFullSpan(true); 
  11.             } 
  12.         } 
  13.     }  

最后可以放心的添加了,通過自定義RecyclerView,重寫setAdapter()方法

  1. @Override 
  2.     public void setAdapter(Adapter adapter) { 
  3.         mOriginAdapter =adapter; 
  4.         ensureRefreshHeaderContainer(); 
  5.         ensureHeaderViewContainer(); 
  6.         ensureFooterViewContainer(); 
  7.         ensureLoadMoreFooterContainer();         
  8.            super.setAdapter(new WrapperAdapter(adapter, mRefreshHeaderContainer, mHeaderViewContainer, mFooterViewContainer, mLoadMoreFooterContainer)); 
  9.     }  

這樣就加入了頭/尾布局以及上拉加載/下拉刷新布局。

總結

文章篇幅所限,“上拉加載/下拉刷新”等其他操作可點擊左下角“閱讀原文”查看。目前由于多類型+頭尾以及上拉刷新/下拉加載,判斷類型過多,在頭布局會出現卡頓,所以在使用多類型的情況下,不建議加入頭尾布局,可以考慮重寫setAdapter方法,去掉不需要的布局。

從效果,到使用,最后到原理,加深了對RecyclerView的理解,recyclerview_helper可以應對一般的使用場景,不過如有特殊應用場景,也可進行比對自定義實現。

Github地址:https://github.com/LRH1993/recyclerview_helper,給個star支持下。 

責任編輯:龐桂玉 來源: 安卓巴士Android開發者門戶
相關推薦

2022-03-18 08:00:48

Chrome工具前端

2025-03-11 08:30:00

Pythonretrying代碼

2023-07-03 07:55:25

2021-07-01 10:03:55

Distroless容器安全

2024-08-02 10:23:20

2019-08-28 09:28:07

SSHOpenSSH運維

2021-03-03 08:02:13

JavaScript函數字節

2010-10-19 15:01:01

2022-09-19 15:02:24

C語言

2013-08-28 10:20:56

2019-07-13 15:31:10

Linux防火墻

2021-01-14 09:59:07

JS代碼編碼

2015-09-06 10:01:24

2020-08-26 19:24:51

iOS 14App Attest防護

2011-05-16 11:04:48

界面設計

2009-09-10 10:02:18

VxWorksLinux圖形界面Linux

2024-01-04 08:23:02

PythonPDFPPT

2021-02-25 09:59:10

數據安全惡意攻擊密碼

2023-06-05 11:40:23

2025-07-29 07:11:39

點贊
收藏

51CTO技術棧公眾號

亚洲高清毛片| 老司机aⅴ在线精品导航| 中文字幕中文在线不卡住| 成人激情免费在线| 九九视频在线免费观看| 亚洲aa在线| 欧美欧美欧美欧美| 日韩av中文字幕第一页| 国产乱视频在线观看| 国产乱理伦片在线观看夜一区| 欧美精品做受xxx性少妇| 成人性生活免费看| 99tv成人影院| 一本久久a久久免费精品不卡| 一区二区av| 亚洲三级中文字幕| 激情图区综合网| 欧美中文字幕第一页| 9999热视频| 亚洲系列另类av| 日韩一区二区免费电影| 欧美性猛交久久久乱大交小说| 99热国产在线| 欧美国产一区视频在线观看| 精品午夜一区二区三区| 国产乱人乱偷精品视频| 久久精品123| 欧美激情18p| 强制高潮抽搐sm调教高h| 亚洲涩涩av| 亚洲国产精品久久久久久| www.超碰97.com| 欧美自拍电影| 香蕉加勒比综合久久| 日韩视频一二三| eeuss影院在线播放| 91在线播放网址| 国产精品久久久久久久久久直播 | 欧美三级乱人伦电影| 91成人在线观看喷潮教学| 超碰在线最新| 成人欧美一区二区三区白人| 日韩欧美视频第二区| 人成在线免费视频| 91视频在线看| 久久久久久久久久码影片| 天天操天天干天天| 99亚偷拍自图区亚洲| 国产精品日韩一区二区| 亚洲AV无码一区二区三区少妇| 精品一区二区在线视频| 成人国产精品久久久久久亚洲| 中文字幕人妻精品一区| 美女视频一区二区三区| 国产日本欧美一区| 亚洲一区中文字幕在线| 久久成人18免费观看| 国产日本欧美在线观看 | 日韩电影在线观看电影| 日本免费久久高清视频| 天堂免费在线视频| 美女在线视频一区| 成人高h视频在线| 精品人妻一区二区三区麻豆91| 国产成人在线色| 国产精品久久亚洲| 青草久久伊人| 国产欧美精品一区aⅴ影院 | 在线亚洲免费| 国产91精品网站| 国产成人精品一区二区色戒| 毛片基地黄久久久久久天堂| 成人免费视频97| 丰满人妻一区二区三区四区53 | 精品在线一区| 麻豆影视在线| 国产精品久久久久久久岛一牛影视 | 老熟妇精品一区二区三区| 秋霞影视一区二区三区| 国产亚洲欧洲高清| 国产中文av在线| 国产综合网站| 日韩美女视频在线观看| 国产孕妇孕交大片孕| 国产成人一区二区精品非洲| 久久大片网站| gogogo高清在线观看免费完整版| 亚洲日本va在线观看| 东北少妇不带套对白| 欧美天堂视频| 91精品国产综合久久精品麻豆| 99精品一区二区三区无码吞精 | 国产免费一区二区三区四在线播放| 在线免费av导航| 精品福利在线视频| 在线观看的毛片| 9l视频自拍蝌蚪9l视频成人| 亚洲欧美日韩精品久久奇米色影视 | 亚洲欧美国产三级| 97av视频在线观看| 精品视频在线观看免费观看| 日韩大片在线观看视频| 国产精品酒店视频| 国产视频一区三区| 成人午夜在线观看| 欧美日韩免费做爰大片| 亚洲乱码中文字幕综合| 欧美性猛交久久久乱大交小说| 亚洲视频精选| 日韩中文在线中文网在线观看| 动漫精品一区一码二码三码四码| 美日韩一区二区三区| 久久国产日韩欧美| 天堂亚洲精品| 欧美区一区二区三区| 人妻少妇精品视频一区二区三区| 亚洲老妇激情| 国产精品视频一区二区高潮| 亚州精品国产精品乱码不99按摩| 亚洲美女偷拍久久| 中文字幕第36页| 亚洲裸色大胆大尺寸艺术写真| 欧美精品中文字幕一区| 91高潮大合集爽到抽搐| 国产夜色精品一区二区av| 男人的天堂avav| 9999精品免费视频| 中文字幕最新精品| 免费污污视频在线观看| 不卡的看片网站| 2018中文字幕第一页| avtt久久| 久久伊人色综合| 97精品人妻一区二区三区香蕉| 国产日韩欧美在线一区| 欧美私人情侣网站| 五月国产精品| 57pao国产成人免费| 蜜桃在线一区二区| 亚洲综合视频在线| 欧美图片自拍偷拍| 欧美午夜一区| 国产欧美日韩视频一区二区三区| 最新日本在线观看| 日韩一区二区免费电影| 欧美xxxx黑人xyx性爽| 国产一区亚洲一区| mm131午夜| 免费一级欧美片在线观看网站| 中文字幕九色91在线| 亚洲一级黄色大片| 中文字幕在线观看不卡视频| 免费网站在线观看黄| 99久久婷婷这里只有精品| 国产主播欧美精品| 麻豆tv在线| 欧美一区二区三区男人的天堂| 国产性生活大片| 国产毛片精品视频| 日韩精品一区二区三区四| 无人区乱码一区二区三区| 欧美成人精品影院| 日本韩国在线观看| 色视频欧美一区二区三区| 国产jjizz一区二区三区视频| 三级一区在线视频先锋 | av蓝导航精品导航| heyzo一区| 亚洲精品在线观看www| а中文在线天堂| 亚洲免费伊人电影| 美女搡bbb又爽又猛又黄www| 国产欧美一区二区色老头| 日本高清视频一区二区三区| 欧美天堂一区二区| 久久6免费高清热精品| 天天操天天干天天插| 日本乱人伦aⅴ精品| 中文字幕美女视频| 成人精品免费视频| 青青草av网站| 欧美一区91| 久久99精品国产99久久| 国产经典一区| 久久久久国产精品www| 欧美在线观看在线观看| 欧美二区在线观看| 国产一级18片视频| 中文字幕亚洲综合久久菠萝蜜| 91精品啪在线观看国产| 天堂蜜桃91精品| 欧美xxxx吸乳| 国产成人影院| 99久久久精品免费观看国产| 裤袜国产欧美精品一区| 久久91亚洲人成电影网站| 国产在线超碰| 欧美va亚洲va| 亚洲中文无码av在线| 亚洲午夜久久久久久久久电影网 | 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲综合婷婷久久| 一区二区日本视频| 色撸撸在线观看| 九九精品在线| 国产精品手机在线| 91麻豆精品国产综合久久久 | 卡通动漫国产精品| 91精品啪在线观看麻豆免费| 粉嫩一区二区| 国模叶桐国产精品一区| 美女隐私在线观看| 亚洲一级黄色片| 天堂在线观看免费视频| 91精品久久久久久久91蜜桃| 中文字幕在线欧美| 亚洲一二三四在线观看| 欧美日韩午夜视频| 国产欧美日韩综合精品一区二区| 国产精品麻豆入口| 国产高清亚洲一区| 天天摸天天舔天天操| 日本在线观看不卡视频| 成人在线免费在线观看| 亚洲国产第一| 青草网在线观看| 亚洲成人精选| 在线天堂一区av电影| 精品高清久久| 日韩av电影免费在线| 亚洲综合小说图片| 久久久久久久久久久久久9999| 秋霞影院一区| 亚洲字幕一区二区| 欧美久久一区二区三区| 91久久精品久久国产性色也91| 影音成人av| 国产精品户外野外| 国产亚洲一区二区手机在线观看 | 精品福利网址导航| 超碰国产精品久久国产精品99| 美国十次综合久久| 亚洲bt欧美bt日本bt| 国产精品一区二区精品| 国产一区在线播放| 亚洲日韩中文字幕一区| 成人国产精品日本在线| 国产欧美日韩电影| 亚洲字幕在线观看| 波多野结衣欧美| 国产精品二区在线观看| 精品视频高潮| 久久综合久久综合这里只有精品| 欧美综合精品| 欧美精品一区二区视频| 精品久久久久久久| 亚洲精品一卡二卡三卡四卡| 国产精品成久久久久| 99re99热| 今天的高清视频免费播放成人| 日本中文字幕在线视频观看| 国产午夜精品一区二区三区欧美 | 91日韩精品一区| 97超碰在线资源| 亚洲国产精品高清| 91嫩草丨国产丨精品| 亚洲图片欧美一区| 国产精品午夜影院| 欧美专区在线观看一区| 国产精品国产精品国产专区| 日韩一区二区免费在线电影| 日本黄色三级视频| 亚洲人永久免费| 米奇777四色精品人人爽| 欧美—级高清免费播放| 视频二区不卡| 亚洲一区二区久久久久久| 精品无人区一区二区| 日本在线观看一区| 亚洲精品97| 成年人网站免费视频| 人人狠狠综合久久亚洲| 1314成人网| 99久久综合色| 午夜影院黄色片| 亚洲网友自拍偷拍| 亚洲精品国产精品国自产网站按摩| 欧美一区二区播放| 每日更新在线观看av| 久久久国产在线视频| 欧美日韩在线观看首页| 国产精品人成电影在线观看| 欧美1区2区3| 视频在线一区二区三区| 狠狠综合久久| 在线观看国产中文字幕| 91丝袜呻吟高潮美腿白嫩在线观看| 波多野结衣喷潮| 一本大道久久a久久精品综合| 国产极品999| 在线观看久久av| 国产拍在线视频| 2019国产精品视频| 精品一区电影| 亚洲中文字幕无码专区| 国产精品一区二区久激情瑜伽| brazzers精品成人一区| 亚洲影院理伦片| 国产又粗又猛又色又| 亚洲日本中文字幕| 91九色国产在线播放| 成人免费xxxxx在线观看| 欧美一级本道电影免费专区| 久久国产精品视频在线观看| 国产在线精品一区在线观看麻豆| www.av欧美| 五月天视频一区| 亚洲va久久久噜噜噜无码久久| 最新国产精品亚洲| 欧美日韩尤物久久| 欧美日韩精品一区| 国产欧美日韩综合一区在线播放| 1314成人网| 亚洲精品欧美综合四区| 91精东传媒理伦片在线观看| 国产亚洲激情在线| 欧美一级大黄| 欧美日韩精品一区| 美女精品一区| 短视频在线观看| 精品久久久久久久久久久久| 黄色小视频免费观看| 色中色综合影院手机版在线观看| 欧美视频第一| 一区二区三区四区视频在线| 日韩电影免费在线观看网站| 在线观看福利片| 一本一道久久a久久精品| 水中色av综合| 欧美怡红院视频一区二区三区| 欧美一区自拍| 成人三级视频在线播放| 国产欧美视频在线观看| 懂色av蜜臀av粉嫩av喷吹| 中日韩美女免费视频网址在线观看 | 中国特级黄色片| 一级精品视频在线观看宜春院| 99久久亚洲精品日本无码| 久久五月情影视| 精品一区二区三区中文字幕视频 | 欧美tk—视频vk| gogo高清午夜人体在线| 国产欧美日韩综合一区在线观看 | 熟妇高潮一区二区三区| 97国产成人精品视频| 青青草这里只有精品| 无码人妻丰满熟妇区五十路百度| 久久精品一区二区三区不卡牛牛 | 亚洲成在人线av| 久草免费在线视频| 日本一区二区在线视频| 美女视频一区二区三区| 欧美人禽zoz0强交| 精品99一区二区三区| av日韩亚洲| 一区二区三区四区国产| 国产suv一区二区三区88区| 亚欧洲精品在线视频| 亚洲欧洲国产伦综合| 国产精品原创视频| www.18av.com| 91视频国产资源| 91国内精品视频| 亚州成人av在线| 欧美日韩一区二区综合| 日本国产一级片| 午夜久久久影院| 东热在线免费视频| 91精品黄色| 久久激情综合| 成人自拍小视频| 亚洲精品电影网在线观看| 午夜av成人| 青青草视频在线视频| 久久久久久久久蜜桃| 国产精品天天操| 欧美一级免费视频| 91亚洲国产| 无码人妻精品一区二区三区温州| 欧美三片在线视频观看| 91九色美女在线视频| 亚洲一区精彩视频| 99久久精品费精品国产一区二区 | 日韩欧美区一区二| jizz内谢中国亚洲jizz| 毛片在线视频观看| 国产精品系列在线| 神马午夜在线观看| 成人免费直播live| 日韩精品高清不卡|