日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 下拉刷新

發(fā)布時間:2025/3/21 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 下拉刷新 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、實現(xiàn)分析
????? 實現(xiàn)原理:
? ? ?(1)下拉,顯示提示頭部界面,這個過程提示用戶"下拉刷新"
? ? ? ? a. 下拉的操作,首先是監(jiān)聽滾動,ListView提供了onScroll()方法
? ? ? ? b. 與下拉類似一個動作向下飛滑,所以ListView的scrollState有3種值:SCROLL_STATE_IDLE,?SCROLL_STATE_TOUCH_SCROLL,?SCROLL_STATE_FLING,意思容易理解,而我們要下拉的觸發(fā)條件是SCROLL_STATE_TOUCH_SCROLL。判斷當(dāng)前的下拉操作狀態(tài),ListView提供了public void onScrollStateChanged(AbsListView view, int scrollState) {}。
? ????? c. 下拉的過程中,我們可能還需要下拉到多少的邊界值處理,重寫onTouchEvent(MotionEvent ev){}方法,可依據(jù)ACTION_DOWN,ACTION_MOVE,ACTION_UP實現(xiàn)更精細的判斷。
? ? (2)下拉到一定程度,超出了刷新最基本的下拉界限,我們認為達到了刷新的條件,提示用戶可以"松手刷新"了,效果上允許用戶繼續(xù)下拉
? ? ? ? a. 達到下拉刷新界限,一般指達到header的高度的,所以有兩步,第一,獲取header的高度,第二,當(dāng)header.getBottom()>=header的高度時,我們認為就達到了刷新界限值
? ? ? ? b. 繼續(xù)允許用戶下拉,當(dāng)header完全下拉后,默認無法繼續(xù)下拉,但是可以增加header的PaddingTop實現(xiàn)這種效果
? ? (3) 用戶松手,可能用戶下拉遠遠不止提示頭部界面,所以這一步,先反彈回僅顯示提示頭部界面,然后提示用戶"正在加載"。
? ? ? ? a. 松手后反彈,這個不能一下子彈回去,看上去太突然,需要一步一步柔性的彈回去,像彈簧一樣,我們可以new一個Thread循環(huán)計算減少PaddingTop,直到PaddingTop為0,反彈結(jié)束。
? ? ? ? b. 正在加載,在子線程里處理后臺任務(wù)
? ? (4) 加載完成后,隱藏提示頭部界面。
? ? ? ? a. 后臺任務(wù)完成后,我們需要隱藏header,setSelection(1)即實現(xiàn)了從第2項開始顯示,間接隱藏了header。
上面我們分析了實現(xiàn)過程的輪廓,接下來,我們通過細節(jié)說明和代碼具體實現(xiàn)。

二、 初始化
? ? 一切狀態(tài)顯示都是用HeaderView顯示的,所以我們需要一個HeaderView的layout,使用addHeaderView方法添加到ListView中。
? ? 同時,默認狀態(tài)下,HeaderView是不顯示的,只是在下拉后才顯示,所以我們需要隱藏HeaderView且不影響后續(xù)的下拉顯示,用setSelection(1)。
? ? refresh_list_header.xml布局如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

??? android:layout_width="fill_parent"

??? android:layout_height="wrap_content"

??? android:gravity="center">

??? <ProgressBar android:id="@+id/refresh_list_header_progressbar"

??????? android:layout_width="wrap_content"

??????? android:layout_height="wrap_content"

??????? android:layout_gravity="center"

??????? style="?android:attr/progressBarStyleSmall"

????? ??android:visibility="gone">

??? </ProgressBar>

??? <ImageView android:id="@+id/refresh_list_header_pull_down"

??????? android:layout_width="9dip"

??????? android:layout_height="25dip"

??????? android:layout_gravity="center"

??????? android:src="@drawable/refresh_list_pull_down" />

??? <ImageView android:id="@+id/refresh_list_header_release_up"

??????? android:layout_width="9dip"

??????? android:layout_height="25dip"

??????? android:layout_gravity="center"

??????? android:src="@drawable/refresh_list_release_up"

??????? android:visibility="gone" />

??? <RelativeLayout android:layout_width="180dip"

??????? android:layout_height="wrap_content">

??????? <TextView android:id="@+id/refresh_list_header_text"

??????????? android:layout_width="fill_parent"

????????? ??android:layout_height="wrap_content"

??????????? android:gravity="center"

??????????? android:layout_alignParentTop="true"

??????????? android:textSize="12dip"

??????????? android:textColor="#192F06"

??????????? android:paddingTop="8dip"

??????????? android:text="@string/app_list_header_refresh_down"/>

??????? <TextView android:id="@+id/refresh_list_header_last_update"

??????????? android:layout_width="fill_parent"

??????????? android:layout_height="wrap_content"

??????????? android:gravity="center"

???? ???????android:layout_below="@id/refresh_list_header_text"

??????????? android:textSize="12dip"

??????????? android:textColor="#192F06"

??????????? android:paddingBottom="8dip"

??????????? android:text="@string/app_list_header_refresh_last_update"/>

??? </RelativeLayout>

</LinearLayout>

?

代碼中在構(gòu)造函數(shù)中添加init()方法加載如下:

private LinearLayout mHeaderLinearLayout = null;

private TextView mHeaderTextView = null;

private TextView mHeaderUpdateText = null;

private ImageView mHeaderPullDownImageView = null;

private ImageView mHeaderReleaseDownImageView = null;

private ProgressBar mHeaderProgressBar = null;

?

public RefreshListView(Context context) {

??? this(context, null);

}

public RefreshListView(Context context, AttributeSet attrs) {

??? super(context, attrs);

??? init(context);

}

?

void init(final Context context) {

??? mHeaderLinearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.refresh_list_header, null);

??? addHeaderView(mHeaderLinearLayout);

??? mHeaderTextView = (TextView) findViewById(R.id.refresh_list_header_text);

??? mHeaderUpdateText = (TextView) findViewById(R.id.refresh_list_header_last_update);

??? mHeaderPullDownImageView = (ImageView) findViewById(R.id.refresh_list_header_pull_down);

??? mHeaderReleaseDownImageView = (ImageView) findViewById(R.id.refresh_list_header_release_up);

??? mHeaderProgressBar = (ProgressBar) findViewById(R.id.refresh_list_header_progressbar);

?

??? setSelection(1);

}默認就顯示完成了。

三、?HeaderView的默認高度測量
? ? 因為下拉到HeaderView全部顯示出來,就由提示"下拉刷新"變?yōu)?#34;松手刷新",全部顯示的出來的測量標(biāo)準就是header.getBottom()>=header的高度。
? ? 所以,首先我們需要測量HeaderView的默認高度。

//因為是在構(gòu)造函數(shù)里測量高度,應(yīng)該先measure一下

private void measureView(View child) {

??? ViewGroup.LayoutParams p = child.getLayoutParams();

??? if (p == null) {

??????? p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,

??????????????? ViewGroup.LayoutParams.WRAP_CONTENT);

??? }

?

??? int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);

??? int lpHeight = p.height;

??? int childHeightSpec;

??? if (lpHeight > 0) {

??????? childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,

??????????????? MeasureSpec.EXACTLY);

??? } else {

??????? childHeightSpec = MeasureSpec.makeMeasureSpec(0,

????? ??????????MeasureSpec.UNSPECIFIED);

??? }

??? child.measure(childWidthSpec, childHeightSpec);

}?

然后在init的上述代碼后面加上調(diào)用measureView后,使用getMeasureHeight()方法獲取header的高度:

private?int?mHeaderHeight;

void?init(final?Context context) {

????... ...

????measureView(mHeaderLinearLayout);

????mHeaderHeight = mHeaderLinearLayout.getMeasuredHeight();

}

后面我們就會用到這個mHeaderHeight.

四、?scrollState監(jiān)聽記錄
scrollState有3種,使用onScrollStateChanged()方法監(jiān)聽記錄。

private?int?mCurrentScrollState;

@Override

public?void?onScrollStateChanged(AbsListView view, int?scrollState) {

????mCurrentScrollState = scrollState;

}

然后即可使用mCurrentScrollState作為后面判斷的條件了。

五、?刷新狀態(tài)分析
? ? 因為一些地方需要知道我們處在正常狀態(tài)下還是進入下拉刷新狀態(tài)還是松手反彈狀態(tài),比如,
? ? (1). 在非正常的狀態(tài)下,我們不小心飛滑了一下(松手的瞬間容易出現(xiàn)這種情況),我們不能setSelection(1)的,否則總是松手后header跳的一下消失掉了。
? ? (2). 下拉后要做一個下拉效果的特殊處理,需要用到OVER_PULL_REFRESH(松手刷新狀態(tài)下)
? ? (3). 松手反彈后要做一個反彈效果的特殊處理,需要用到OVER_PULL_REFRESH和ENTER_PULL_REFRESH。

private final static int NONE_PULL_REFRESH = 0;?? //正常狀態(tài)

private final static int ENTER_PULL_REFRESH = 1;? //進入下拉刷新狀態(tài)

private final static int OVER_PULL_REFRESH = 2;?? //進入松手刷新狀態(tài)

private final static int EXIT_PULL_REFRESH = 3;???? //松手后反彈后加載狀態(tài)

private int mPullRefreshState = 0;???????????????????????? //記錄刷新狀態(tài)

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

??? if (mCurrentScrollState ==SCROLL_STATE_TOUCH_SCROLL

??????????? && firstVisibleItem == 0

??????????? && (mHeaderLinearLayout.getBottom() >= 0 && mHeaderLinearLayout.getBottom() < mHeaderHeight)) {

??????? //進入且僅進入下拉刷新狀態(tài)

??????? if (mPullRefreshState == NONE_PULL_REFRESH) {

??????????? mPullRefreshState = ENTER_PULL_REFRESH;

??????? }

??? } else if (mCurrentScrollState ==SCROLL_STATE_TOUCH_SCROLL

??????????? && firstVisibleItem == 0

??????????? && (mHeaderLinearLayout.getBottom() >= mHeaderHeight)) {

??????? //下拉達到界限,進入松手刷新狀態(tài)

??????? if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == NONE_PULL_REFRESH) {

??????????? mPullRefreshState = OVER_PULL_REFRESH;

??????????? //下面是進入松手刷新狀態(tài)需要做的一個顯示改變

????? ??????mDownY = mMoveY;//用于后面的下拉特殊效果

??????????? mHeaderTextView.setText("松手刷新");

??????????? mHeaderPullDownImageView.setVisibility(View.GONE);

??????????? mHeaderReleaseDownImageView.setVisibility(View.VISIBLE);

??????? }

??? } else if (mCurrentScrollState ==SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem != 0) {

??????? //不刷新了

??????? if (mPullRefreshState == ENTER_PULL_REFRESH) {

??????????? mPullRefreshState = NONE_PULL_REFRESH;

??????? }

??? } else if (mCurrentScrollState == SCROLL_STATE_FLING && firstVisibleItem == 0) {

??????? //飛滑狀態(tài),不能顯示出header,也不能影響正常的飛滑

??????? //只在正常情況下才糾正位置

??????? if (mPullRefreshState == NONE_PULL_REFRESH) {

??????????? setSelection(1);

??????? }

??? }

}

mPullRefreshState將是后面我們處理邊界的重要變量。

六、下拉效果的特殊處理
所謂的特殊處理,當(dāng)header完全顯示后,下拉只按下拉1/3的距離下拉,給用戶一種艱難下拉,該松手的彈簧感覺。
這個在onTouchEvent里處理比較方便:

private float mDownY;

private float mMoveY;

@Override

public boolean onTouchEvent(MotionEvent ev) {

??? switch (ev.getAction()) {

??????? case MotionEvent.ACTION_DOWN:

??????????? //記下按下位置

??????? ????//改變

??????????? mDownY = ev.getY();

??????????? break;

??????? case MotionEvent.ACTION_MOVE:

??????????? //移動時手指的位置

??????????? mMoveY = ev.getY();

??????????? if (mPullRefreshState == OVER_PULL_REFRESH) {

??????????????? //注意下面的mDownY在onScroll的第二個else中被改變了

??????????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????????? (int)((mMoveY - mDownY)/3), //1/3距離折扣

??????????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????? }

??????????? break;

??????? case MotionEvent.ACTION_UP:

??????????? ... ...

??????????? break;

??? }

??? return super.onTouchEvent(ev);

}

?

//重復(fù)貼出下面這段需要注意的代碼

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

??? ... ...

??? else if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL

??????????? && firstVisibleItem == 0

??????????? && (mHeaderLinearLayout.getBottom() >= mHeaderHeight)) {

??????? //下拉達到界限,進入松手刷新狀態(tài)

??????? if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == NONE_PULL_REFRESH) {

??????????? mPullRefreshState = OVER_PULL_REFRESH;

??????????? mDownY = mMoveY; //為下拉1/3折扣效果記錄開始位置

??????????? mHeaderTextView.setText("松手刷新");//顯示松手刷新

??????????? mHeaderPullDownImageView.setVisibility(View.GONE);//隱藏"下拉刷新"

??????????? mHeaderReleaseDownImageView.setVisibility(View.VISIBLE);//顯示向上的箭頭

??????? }

??? }

??? ... ...

}

onScroll里監(jiān)聽到了進入松手刷新狀態(tài),onTouchEvent就開始在ACTION_MOVE中處理1/3折扣問題。

六、 反彈效果的特殊處理
松手后我們需要一個柔性的反彈效果,意味著我們彈回去的過程需要分一步步走,我的解決方案是:
在子線程里計算PaddingTop,并減少到原來的3/4,循環(huán)通知主線程,直到PaddingTop小于1(這個值取一個小值,合適即可)。
松手后,當(dāng)然是在onTouchEvent的ACTION_UP條件下處理比較方便:

//因為涉及到handler數(shù)據(jù)處理,為方便我們定義如下常量

private final static int REFRESH_BACKING = 0;????? //反彈中

private final static int REFRESH_BACED = 1;??????? //達到刷新界限,反彈結(jié)束后

private final static int REFRESH_RETURN = 2;?????? //沒有達到刷新界限,返回

private final static int REFRESH_DONE = 3;???????? //加載數(shù)據(jù)結(jié)束

?

@Override

public boolean onTouchEvent(MotionEvent ev) {

??? switch (ev.getAction()) {

??????? ... ...

??????? case MotionEvent.ACTION_UP:

??????????? //when you action up, it will do these:

??????????? //1. roll back util header topPadding is 0

??????????? //2. hide the header by setSelection(1)

??????????? if (mPullRefreshState == OVER_PULL_REFRESH || mPullRefreshState == ENTER_PULL_REFRESH) {

??????????????? new Thread() {

??????????????????? public void run() {

??????????????????????? Message msg;

??????????????????????? while(mHeaderLinearLayout.getPaddingTop() > 1) {

??????????????????????????? msg = mHandler.obtainMessage();

??????????????????????????? msg.what = REFRESH_BACKING;

??????????????????????????? mHandler.sendMessage(msg);

??????????????????????????? try {

??????????????????????????????? sleep(5);//慢一點反彈,別一下子就彈回去了

??????????????????????????? } catch (InterruptedException e) {

??????????????????????????????? e.printStackTrace();

??????????????????????????? }

??????????????????????? }

??????????????????????? msg = mHandler.obtainMessage();

?????????????????? ?????if (mPullRefreshState == OVER_PULL_REFRESH) {

??????????????????????????? msg.what = REFRESH_BACED;//加載數(shù)據(jù)完成,結(jié)束返回

??????????????????????? } else {

??????????????????????????? msg.what = REFRESH_RETURN;//未達到刷新界限,直接返回

??????????????????????? }

????????? ??????????????mHandler.sendMessage(msg);

??????????????????? };

??????????????? }.start();

??????????? }

??????????? break;

??? }

??? return super.onTouchEvent(ev);

}

?

private Handler mHandler = new Handler(){

??? @Override

??? public void handleMessage(Message msg) {

??????? switch (msg.what) {

??????? case REFRESH_BACKING:

??????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????? (int) (mHeaderLinearLayout.getPaddingTop()*0.75f),

??????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????? break;

??????? case REFRESH_BACED:

??????????? mHeaderTextView.setText("正在加載...");

??????????? mHeaderProgressBar.setVisibility(View.VISIBLE);

??????????? mHeaderPullDownImageView.setVisibility(View.GONE);

??????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????? mPullRefreshState = EXIT_PULL_REFRESH;

??????????? new Thread() {

??????????????? public void run() {

??????????????????? sleep(2000);//處理后臺加載數(shù)據(jù)

??????????????????? Message msg = mHandler.obtainMessage();

??????????????????? msg.what = REFRESH_DONE;

??????????????????? //通知主線程加載數(shù)據(jù)完成

??????????????????? mHandler.sendMessage(msg);

??????????????? };

??????????? }.start();

?????????? ?break;

??????? case REFRESH_RETURN:

??????????? //未達到刷新界限,返回

??????????? mHeaderTextView.setText("下拉刷新");

??????????? mHeaderProgressBar.setVisibility(View.INVISIBLE);

??????????? mHeaderPullDownImageView.setVisibility(View.VISIBLE);

??????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????? 0,

??????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????? mPullRefreshState = NONE_PULL_REFRESH;

??????????? setSelection(1);

??????????? break;

??????? case REFRESH_DONE:

??????????? //刷新結(jié)束后,恢復(fù)原始默認狀態(tài)

??????????? mHeaderTextView.setText("下拉刷新");

??????????? mHeaderProgressBar.setVisibility(View.INVISIBLE);

??????????? mHeaderPullDownImageView.setVisibility(View.VISIBLE);

??????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????? mHeaderUpdateText.setText(getContext().getString(R.string.app_list_header_refresh_last_update,

??????????????????? mSimpleDateFormat.format(new Date())));

??????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????? 0,

??????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????? mPullRefreshState = NONE_PULL_REFRESH;

??????????? setSelection(1);

??????????? break;

??????? default:

??????????? break;

??????? }

??? }

};

? 為了一下子看的明確,我把效果中的數(shù)據(jù)處理代碼也貼出來了。

七、切入數(shù)據(jù)加載過程

上面數(shù)據(jù)后臺處理我們用sleep(2000)來處理,實際處理中,作為公共組件,我們也不好把具體代碼直接寫在這里,我們需要一個更靈活的分離:

(1)定義接口

(2)注入接口

//定義接口

public interface RefreshListener {

??? Object refreshing();??????????????? //加載數(shù)據(jù)

??? void refreshed(Object obj);??? //外部可擴展加載完成后的操作

}

?

//注入接口

private Object mRefreshObject = null; //傳值

private RefreshListener mRefreshListener = null;

public void setOnRefreshListener(RefreshListener refreshListener) {

??? this.mRefreshListener = refreshListener;

}?

//我們需要重寫上面的mHandler如下代碼

case REFRESH_BACED:

??? ... ...

??? new Thread() {

??????? public void run() {

??????????? if (mRefreshListener != null) {

??????????????? mRefreshObject = mRefreshListener.refreshing();

??? ????????}

??????????? Message msg = mHandler.obtainMessage();

??????????? msg.what = REFRESH_DONE;

??????????? mHandler.sendMessage(msg);

??????? };

??? }.start();

??? break;

case REFRESH_DONE:

??? ... ...

??? mPullRefreshState = NONE_PULL_REFRESH;

??? setSelection(1);

??? if (mRefreshListener != null) {

??????? mRefreshListener.refreshed(mRefreshObject);

??? }

??? break;

??? 在其他地方我們就可以不修改這個listview組件的代碼,使用如下:

public xxx implements RefreshListener{?

@Override

??? protected void onCreate(Bundle savedInstanceState) {

??????? super.onCreate(savedInstanceState);

????? ??//類似如下

??????? ((RefreshListView) listView).setOnRefreshListener(this);

??? }

?

??? @Override

??? public Object refreshing() {

??????? String result = null;

??????? //result = FileUtils.readTextFile(file);

??????? return result;

??? }

?

??? @Override

?? ?public void refreshed(Object obj) {

??????? if (obj != null) {

?????????? //擴展操作

??????? }

??? };

}

很方便了。

八、?擴展"更多"功能
下拉刷新之外,我們也可以通過相同方法使用FooterView切入底部"更多"過程,這里我就不詳細說明了

九、源碼

上面的每段代碼都看做是"零部件",需要組合一下。
因為我們上面實現(xiàn)了下拉刷新,還增加了"更多"功能,我們直接命名這個類為RefreshListView吧:

package com.tianxia.lib.baseworld.widget;

?

import java.text.SimpleDateFormat;

import java.util.Date;

?

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListAdapter;

import android.widget.ListView;

import android.widget.ProgressBar;

import android.widget.TextView;

?

import com.tianxia.lib.baseworld.R;

?

/**

?* 下拉刷新,底部更多

?*/

public class RefreshListView extends ListView implements OnScrollListener{

?

??? private float mDownY;

??? private float mMoveY;

?

??? private int mHeaderHeight;?

??? private int mCurrentScrollState;

?

??? private final static int NONE_PULL_REFRESH = 0;??? //正常狀態(tài)

??? private final static int ENTER_PULL_REFRESH = 1;?? //進入下拉刷新狀態(tài)

??? private final static int OVER_PULL_REFRESH = 2;??? //進入松手刷新狀態(tài)

??? private final static int EXIT_PULL_REFRESH = 3;??? //松手后反彈和加載狀態(tài)

??? private int mPullRefreshState = 0;???????????????? //記錄刷新狀態(tài)

?

??? private final static int REFRESH_BACKING = 0;????? //反彈中

??? private final static int REFRESH_BACED = 1;??????? //達到刷新界限,反彈結(jié)束后

??? private final static int REFRESH_RETURN = 2;?????? //沒有達到刷新界限,返回

??? private final static int REFRESH_DONE = 3;???????? //加載數(shù)據(jù)結(jié)束

?

??? private LinearLayout mHeaderLinearLayout = null;

??? private LinearLayout mFooterLinearLayout = null;

??? private TextView mHeaderTextView = null;

??? private TextView mHeaderUpdateText = null;

??? private ImageView mHeaderPullDownImageView = null;

??? private ImageView mHeaderReleaseDownImageView = null;

??? private ProgressBar mHeaderProgressBar = null;

??? private TextView mFooterTextView = null;

??? private ProgressBar mFooterProgressBar = null;

?

??? private SimpleDateFormat mSimpleDateFormat;

?

??? private Object mRefreshObject = null;

??? private RefreshListener mRefreshListener = null;

??? public void setOnRefreshListener(RefreshListener refreshListener) {

??????? this.mRefreshListener = refreshListener;

??? }

?

??? public RefreshListView(Context context) {

??????? this(context, null);

??? }

?

??? public RefreshListView(Context context, AttributeSet attrs) {

??????? super(context, attrs);

??????? init(context);

??? }

?

??? void init(final Context context) {

??????? mHeaderLinearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.refresh_list_header, null);

??????? addHeaderView(mHeaderLinearLayout);

??????? mHeaderTextView = (TextView) findViewById(R.id.refresh_list_header_text);

???? ???mHeaderUpdateText = (TextView) findViewById(R.id.refresh_list_header_last_update);

??????? mHeaderPullDownImageView = (ImageView) findViewById(R.id.refresh_list_header_pull_down);

??????? mHeaderReleaseDownImageView = (ImageView) findViewById(R.id.refresh_list_header_release_up);

??????? mHeaderProgressBar = (ProgressBar) findViewById(R.id.refresh_list_header_progressbar);

?

??????? mFooterLinearLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.refresh_list_footer, null);

??????? addFooterView(mFooterLinearLayout);

??????? mFooterProgressBar = (ProgressBar) findViewById(R.id.refresh_list_footer_progressbar);

??????? mFooterTextView = (TextView) mFooterLinearLayout.findViewById(R.id.refresh_list_footer_text);

??????? mFooterLinearLayout.setOnClickListener(new OnClickListener() {

??????????? @Override

??????????? public void onClick(View v) {

??????????????? if (context.getString(R.string.app_list_footer_more).equals(mFooterTextView.getText())) {

??????????????????? mFooterTextView.setText(R.string.app_list_footer_loading);

??????????????????? mFooterProgressBar.setVisibility(View.VISIBLE);

??????????????????? if (mRefreshListener != null) {

??????????????????????? mRefreshListener.more();

??????????????????? }

??????????????? }

????????? ??}

??????? });

?

??????? setSelection(1);

??????? setOnScrollListener(this);

??????? measureView(mHeaderLinearLayout);

??????? mHeaderHeight = mHeaderLinearLayout.getMeasuredHeight();

?

??????? mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");

??????? mHeaderUpdateText.setText(context.getString(R.string.app_list_header_refresh_last_update, mSimpleDateFormat.format(new Date())));

??? }

?

??? @Override

??? public boolean onTouchEvent(MotionEvent ev) {

??????? switch (ev.getAction()) {

?????????? ?case MotionEvent.ACTION_DOWN:

??????????????? mDownY = ev.getY();

??????????????? break;

??????????? case MotionEvent.ACTION_MOVE:

??????????????? mMoveY = ev.getY();

??????????????? if (mPullRefreshState == OVER_PULL_REFRESH) {

??????????????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????????????? (int)((mMoveY - mDownY)/3),

??????????????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????????? }

??????????????? break;

??????????? case MotionEvent.ACTION_UP:

??????????????? //when you action up, it will do these:

??????????????? //1. roll back util header topPadding is 0

??????????????? //2. hide the header by setSelection(1)

???? ???????????if (mPullRefreshState == OVER_PULL_REFRESH || mPullRefreshState == ENTER_PULL_REFRESH) {

??????????????????? new Thread() {

??????????????????????? public void run() {

??????????????????????????? Message msg;

??????????????????????????? while(mHeaderLinearLayout.getPaddingTop() > 1) {

??????????????????????????????? msg = mHandler.obtainMessage();

??????????????????????????????? msg.what = REFRESH_BACKING;

??????????????????????????????? mHandler.sendMessage(msg);

??????????????????????????????? try {

??????????????????????????????????? sleep(5);

??????????????????????????????? } catch (InterruptedException e) {

??????????????????????????????????? e.printStackTrace();

??????????????????????????????? }

??????????????????????????? }

??????????????? ????????????msg = mHandler.obtainMessage();

??????????????????????????? if (mPullRefreshState == OVER_PULL_REFRESH) {

??????????????????????????????? msg.what = REFRESH_BACED;

??????????????????????????? } else {

??????????????????????????????? msg.what = REFRESH_RETURN;

??????????????????????????? }

??????????????????????????? mHandler.sendMessage(msg);

??????????????????????? };

??????????????????? }.start();

??????????????? }

??????????????? break;

??????? }

??????? return super.onTouchEvent(ev);

??? }

?

??? @Override

??? public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

??????? if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL

??????????????? && firstVisibleItem == 0

??????????????? && (mHeaderLinearLayout.getBottom() >= 0 && mHeaderLinearLayout.getBottom() < mHeaderHeight)) {

??????????? //進入且僅進入下拉刷新狀態(tài)

??????????? if (mPullRefreshState == NONE_PULL_REFRESH) {

??????????????? mPullRefreshState = ENTER_PULL_REFRESH;

??????????? }

??????? } else if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL

??????????????? && firstVisibleItem == 0

??????????????? && (mHeaderLinearLayout.getBottom() >= mHeaderHeight)) {

??????????? //下拉達到界限,進入松手刷新狀態(tài)

??????????? if (mPullRefreshState == ENTER_PULL_REFRESH || mPullRefreshState == NONE_PULL_REFRESH) {

??????????????? mPullRefreshState = OVER_PULL_REFRESH;

??????????????? mDownY = mMoveY; //為下拉1/3折扣效果記錄開始位置

??????????????? mHeaderTextView.setText("松手刷新");//顯示松手刷新

??????????????? mHeaderPullDownImageView.setVisibility(View.GONE);//隱藏"下拉刷新"

??????????????? mHeaderReleaseDownImageView.setVisibility(View.VISIBLE);//顯示向上的箭頭

??????????? }

??????? } else if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL && firstVisibleItem != 0) {

??????????? //不刷新了

??????????? if (mPullRefreshState == ENTER_PULL_REFRESH) {

??????????????? mPullRefreshState = NONE_PULL_REFRESH;

??????????? }

??????? } else if (mCurrentScrollState == SCROLL_STATE_FLING && firstVisibleItem == 0) {

??????????? //飛滑狀態(tài),不能顯示出header,也不能影響正常的飛滑

??????????? //只在正常情況下才糾正位置

??????????? if (mPullRefreshState == NONE_PULL_REFRESH) {

??????????????? setSelection(1);

??????????? }

??????? }

??? }

?

??? @Override

??? public void onScrollStateChanged(AbsListView view, int scrollState) {

??????? mCurrentScrollState = scrollState;

??? }

?

??? @Override

??? public void setAdapter(ListAdapter adapter) {

??????? super.setAdapter(adapter);

??????? setSelection(1);

??? }

?

??? private void measureView(View child) {

??????? ViewGroup.LayoutParams p = child.getLayoutParams();

?????? ?if (p == null) {

??????????? p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,

??????????????????? ViewGroup.LayoutParams.WRAP_CONTENT);

??????? }

?

??????? int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);

??????? int lpHeight = p.height;

??????? int childHeightSpec;

??????? if (lpHeight > 0) {

??????????? childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,

??????????????????? MeasureSpec.EXACTLY);

??????? } else {

??????????? childHeightSpec = MeasureSpec.makeMeasureSpec(0,

??????????????????? MeasureSpec.UNSPECIFIED);

??????? }

??????? child.measure(childWidthSpec, childHeightSpec);

??? }

?

??? private Handler mHandler = new Handler(){

??????? @Override

??????? public void handleMessage(Message msg) {

?????????? ?switch (msg.what) {

??????????? case REFRESH_BACKING:

??????????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????????? (int) (mHeaderLinearLayout.getPaddingTop()*0.75f),

??????????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????????? break;

??????????? case REFRESH_BACED:

??????????????? mHeaderTextView.setText("正在加載...");

??????????????? mHeaderProgressBar.setVisibility(View.VISIBLE);

??????????????? mHeaderPullDownImageView.setVisibility(View.GONE);

??????????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????????? mPullRefreshState = EXIT_PULL_REFRESH;

??????????????? new Thread() {

??????????????????? public void run() {

??????????????????????? if (mRefreshListener != null) {

??????????????????????????? mRefreshObject = mRefreshListener.refreshing();

??????????????????????? }

??????????????????????? Message msg = mHandler.obtainMessage();

??????????????????????? msg.what = REFRESH_DONE;

??????????????????????? mHandler.sendMessage(msg);

??????????????????? };

??????????????? }.start();

??????????????? break;

??????????? case REFRESH_RETURN:

??????????????? mHeaderTextView.setText("下拉刷新");

??????????????? mHeaderProgressBar.setVisibility(View.INVISIBLE);

??????????????? mHeaderPullDownImageView.setVisibility(View.VISIBLE);

??????????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????????? 0,

??????????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????????? mPullRefreshState = NONE_PULL_REFRESH;

??????????????? setSelection(1);

??? ????????????break;

??????????? case REFRESH_DONE:

??????????????? mHeaderTextView.setText("下拉刷新");

??????????????? mHeaderProgressBar.setVisibility(View.INVISIBLE);

??????????????? mHeaderPullDownImageView.setVisibility(View.VISIBLE);

??????????????? mHeaderReleaseDownImageView.setVisibility(View.GONE);

??????????????? mHeaderUpdateText.setText(getContext().getString(R.string.app_list_header_refresh_last_update,

??????????????????????? mSimpleDateFormat.format(new Date())));

??????????????? mHeaderLinearLayout.setPadding(mHeaderLinearLayout.getPaddingLeft(),

??????????????????????? 0,

??????????????????????? mHeaderLinearLayout.getPaddingRight(),

??????????????????????? mHeaderLinearLayout.getPaddingBottom());

??????????????? mPullRefreshState = NONE_PULL_REFRESH;

??????????????? setSelection(1);

??????????????? if (mRefreshListener != null) {

??????????????????? mRefreshListener.refreshed(mRefreshObject);

??????????????? }

??????????????? break;

??????????? default:

??????????????? break;

??????????? }

???? ???}

??? };

??? public interface RefreshListener {

??????? Object refreshing();

??????? void refreshed(Object obj);

??????? void more();

??? }

?

??? public void finishFootView() {

??????? mFooterProgressBar.setVisibility(View.GONE);

??????? mFooterTextView.setText(R.string.app_list_footer_more);

??? }

?

??? public void addFootView() {

??????? if (getFooterViewsCount() == 0) {

??????????? addFooterView(mFooterLinearLayout);

??????? }

??? }

?

??? public void removeFootView() {

??????? removeFooterView(mFooterLinearLayout);

??? }

}

11.小結(jié)

這個只是一個原型,無論代碼風(fēng)格和邏輯處理,我覺得還有改進的空間,我會在后續(xù)逐漸改善的。
? ? 以下是例子效果
? ??https://github.com/openproject/world/blob/master/baseworld/src/com/tianxia/lib/baseworld/widget/RefreshListView.java
? ??https://github.com/openproject/world/blob/master/healthworld/src/com/tianxia/app/healthworld/infomation/InfomationTabActivity.java
? ? 期待有建設(shè)性的意見改善這個實現(xiàn)。

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/zhangping/p/3514030.html

總結(jié)

以上是生活随笔為你收集整理的Android 下拉刷新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

中文字幕一区二区三区在线视频 | 91精品国产91久久久久 | 国产精品亚洲片在线播放 | 久久综合五月婷婷 | 丁香电影小说免费视频观看 | av在线一级 | 四虎在线永久免费观看 | 超碰在线98| 13日本xxxxxⅹxxx20 | 91免费高清| 国产精品久久久久久久久久直播 | 99在线观看免费视频精品观看 | 久久一区91 | 成片免费观看视频 | 久久久国产精品视频 | 国产日韩欧美在线 | 91九色蝌蚪视频在线 | 欧美日韩中文字幕在线视频 | 一级黄色在线视频 | 中文久久精品 | 欧美日韩一区二区三区在线免费观看 | 日本护士撒尿xxxx18 | 在线亚洲欧美日韩 | 中文字幕在线免费观看视频 | 激情 一区二区 | 免费在线观看不卡av | 久久情侣偷拍 | 麻豆国产精品一区二区三区 | 蜜臀久久99精品久久久久久网站 | 欧美一区二区伦理片 | 日韩三级在线观看 | 91午夜精品 | 日韩精品一区二区在线 | 国产在线最新 | 国产精品伦一区二区三区视频 | 一级黄色免费 | 日韩字幕在线 | 91在线观 | 欧美一区二区三区在线 | 夜夜夜夜夜夜操 | 中文字幕在线观看一区二区三区 | 99视频在线精品免费观看2 | www色 | 国内精品久久久久影院日本资源 | 欧美色噜噜噜 | 91免费看片黄 | sesese图片| 欧美大片在线看免费观看 | 亚洲国产精品传媒在线观看 | 夜夜操综合网 | 国产成人一区二区三区久久精品 | 久久婷婷综合激情 | 婷婷激情久久 | 久久经典国产视频 | 亚洲国产播放 | 日本一区二区不卡高清 | 天堂网av 在线 | 在线观看黄色国产 | 日韩在线中文字幕视频 | 亚洲国产小视频在线观看 | 亚洲黄色一级视频 | 亚州av成人 | 免费观看成人av | 狠色狠色综合久久 | 久久高清国产视频 | 中文字幕区 | 国产亚洲精品美女 | 中文字幕色综合网 | 国产在线p| 天天射天天干天天插 | 日韩一区二区三区视频在线 | 久久久久国产成人精品亚洲午夜 | 毛片3| 综合久久久久久久久 | 亚洲小视频在线观看 | 99久久一区 | 天天操夜夜操国产精品 | 久久精品网站视频 | 美女视频黄的免费的 | 中文字幕日韩电影 | 四虎成人精品在永久免费 | 999久久久免费精品国产 | 欧美 日韩 成人 | 免费日韩一级片 | 永久精品视频 | www.超碰97.com | 欧美精品一二三 | 中文字幕精品一区二区精品 | 色综合久久88色综合天天人守婷 | 欧美日韩p片 | 免费网站在线观看成人 | 成人av手机在线 | 日韩电影在线观看一区二区三区 | 日韩在线视频看看 | 在线观看一区 | 久久精品一区二 | 久久男女视频 | 亚洲精品视频免费 | 久色网| 免费三级黄色片 | 免费一级特黄毛大片 | 午夜神马福利 | 久久免费电影网 | 国产小视频你懂的在线 | 久久精精品 | 国内丰满少妇猛烈精品播放 | 久久三级毛片 | 亚洲精品美女在线观看播放 | 国产精品久久久久9999 | 免费看一级一片 | 操久在线 | 麻豆久久一区二区 | 亚洲精品动漫久久久久 | 国产91精品一区二区绿帽 | 国产91粉嫩白浆在线观看 | 99色在线视频 | 午夜在线免费观看 | 日韩精品短视频 | 婷婷综合亚洲 | 精品一区二区在线免费观看 | 亚洲精品免费在线 | a资源在线 | 亚洲精品在 | 亚洲国产美女精品久久久久∴ | 在线观看视频一区二区三区 | 亚洲国产成人久久综合 | 国产午夜精品理论片在线 | 婷婷综合五月天 | 亚洲天堂精品视频在线观看 | 国产精品美女免费看 | 久久久久激情视频 | 九九亚洲精品 | 国产成人精品久久久久蜜臀 | 久久97久久97精品免视看 | 大胆欧美gogo免费视频一二区 | 精品欧美小视频在线观看 | 在线观看视频免费大全 | 日韩欧三级 | 亚洲手机av | 一区二区三区免费 | 999久久久久久久久久久 | 又黄又刺激又爽的视频 | 亚洲乱码中文字幕综合 | 69av久久| www.亚洲黄色 | 日韩精品一区二 | 大型av综合网站 | 国产永久免费观看 | 91九色蝌蚪国产 | 黄色免费在线视频 | 91视频国产免费 | 欧美黑人性爽 | 伊人婷婷网 | 久草香蕉在线视频 | av在线网站大全 | 国产精品一区二区久久国产 | 久久久精品 一区二区三区 国产99视频在线观看 | 婷婷伊人综合亚洲综合网 | 日韩成人精品在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 91资源在线 | 亚洲第一成网站 | 久久久久激情视频 | 免费黄色在线 | 欧美激情在线看 | 最新久久久| 久久公开免费视频 | 四虎影视精品 | 国产探花视频在线播放 | 精品国产视频一区 | 亚洲日本黄色 | 国产一级大片在线观看 | 天天干天天操天天搞 | 色天堂在线视频 | 久久久黄色免费网站 | 国产在线观看你懂得 | 韩国一区二区三区视频 | 91日韩在线播放 | 亚洲精品色婷婷 | 超碰在线国产 | 91精品国产入口 | 超碰97国产精品人人cao | 国产成人a亚洲精品v | 黄色小说18| 日韩在线观看 | 亚洲乱亚洲乱亚洲 | 免费男女网站 | 激情综合色图 | 久久国产影视 | 久草久草在线观看 | 在线看成人 | www91在线观看 | 亚洲成年片 | 色资源网在线观看 | 国产精品24小时在线观看 | 国内精品久久久久影院一蜜桃 | 99热都是精品 | 午夜黄色一级片 | 日本九九视频 | 亚洲免费高清视频 | 国产爽妇网 | 日韩黄视频 | 伊人久久精品久久亚洲一区 | 99久久精品久久久久久清纯 | 日韩精品中文字幕一区二区 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产视频每日更新 | 黄色一级大片在线免费看国产一 | 国产成人精品一区二区在线观看 | 手机看片中文字幕 | 色哟哟国产精品 | 欧美激情va永久在线播放 | 国际精品久久 | 日韩二区三区在线观看 | 国产精品免费久久久久影院仙踪林 | 国产区精品在线 | 这里只有精彩视频 | 久久精品91久久久久久再现 | 中文免费在线观看 | 久草免费色站 | 成人亚洲综合 | 日韩欧美精品一区二区三区经典 | 婷婷成人亚洲综合国产xv88 | 午夜精品一二三区 | 久草com| 波多野结衣在线观看一区二区三区 | 国内精品中文字幕 | 成人在线免费视频 | 久久久999精品视频 国产美女免费观看 | 国产日韩中文字幕 | 热精品 | 午夜成人免费电影 | 91在线精品秘密一区二区 | 欧美日韩国产一区二区三区在线观看 | 成人一级黄色片 | 国产成人在线网站 | 国产99视频在线观看 | 中文区中文字幕免费看 | 久久精品8| 久久久受www免费人成 | 日韩网站在线观看 | 中文字幕在线日本 | 永久中文字幕 | 日韩一区正在播放 | 日韩综合在线观看 | 韩日三级av | 97久久精品午夜一区二区 | 91av原创 | 久久久久色| 午夜av色 | 97视频人人澡人人爽 | 免费观看全黄做爰大片国产 | 国产欧美三级 | 国产尤物一区二区三区 | 免费高清av在线看 | 国内精品小视频 | 国产 一区二区三区 在线 | 啪啪免费试看 | 日产av在线播放 | 免费久久久 | 99精品国产兔费观看久久99 | 久色小说| 久久国产视频网 | 97看片| 久久大视频 | 国产精品一区二区三区四区在线观看 | 亚洲精品在线视频网站 | 伊人影院99 | 一区二区三区www | 久久精品福利视频 | 免费看的黄色的网站 | 免费观看91视频 | 精品久久亚洲 | 亚洲一级性 | 久久欧洲视频 | 中文日韩在线 | 国产涩图| 日韩在线观看一区 | 国产精彩视频一区 | 久久视频在线视频 | 欧美大香线蕉线伊人久久 | 婷婷在线视频 | 国产色婷婷 | 久久天| 免费亚洲视频在线观看 | 色噜噜色噜噜 | 99久久精品久久亚洲精品 | 91精品国产电影 | 国产视频99 | 亚洲女欲精品久久久久久久18 | 国产精品久久久久久久久久久久久 | 伊人在线视频 | 激情五月婷婷综合网 | 欧美日韩有码 | 欧美永久视频 | 亚洲欧洲精品一区 | 狠狠色噜噜狠狠狠合久 | 波多野结衣视频一区二区三区 | 欧美精品久久久久久久免费 | 黄色av网站在线免费观看 | 4p变态网欧美系列 | 成人一级片免费看 | 久久视频这里有精品 | 成人国产精品一区二区 | 亚洲精品国偷拍自产在线观看 | 久久午夜精品视频 | 久久国产精品一区二区三区四区 | 亚洲视频 在线观看 | 久久久久久久久久久久久久电影 | 九七视频在线 | av观看在线观看 | 一区二区三区精品在线 | 日韩精品在线看 | 久久性生活片 | 日本久久久久久科技有限公司 | 亚洲一二三久久 | 国产综合福利在线 | 国产视频一区在线播放 | 日韩免费播放 | 中文字幕成人在线 | 中文字幕一区二区三区四区 | 国产成人亚洲在线观看 | 亚洲干视频在线观看 | 亚洲午夜久久久影院 | 国产精品va在线观看入 | 日本视频高清 | 国产精品高 | 国产精品一区二区三区在线播放 | 玖玖玖国产精品 | 人人爽人人爽人人片 | 最新午夜| 亚洲综合五月天 | 男女免费视频观看 | 亚洲黄色小说网址 | 亚洲福利精品 | 国产手机视频在线播放 | 精品亚洲一区二区三区 | 国产精选视频 | 久久成人黄色 | 国产色综合天天综合网 | 99久久久久久国产精品 | 超级碰碰碰碰 | 久久久久久免费视频 | 444av| 黄色大片av| 欧美一级裸体视频 | av天天澡天天爽天天av | 午夜视频99 | 日韩电影在线观看一区二区 | 人人爱人人射 | 国产一区在线观看视频 | 92中文资源在线 | 欧美韩国在线 | 夜夜夜夜操 | 久久免费激情视频 | 麻豆视频免费 | 黄色国产成人 | 国产高清不卡在线 | 久久理论影院 | 不卡的av电影| 99久久综合狠狠综合久久 | 在线播放日韩 | 96亚洲精品久久 | 一区二区欧美在线观看 | 国产做aⅴ在线视频播放 | 亚洲资源一区 | 久久精品久久久久电影 | 青青射| 国产精品网站 | 亚洲欧美视频 | 亚洲国产中文在线 | 日韩理论电影在线观看 | 欧美看片| 99热免费在线 | 亚洲欧美在线观看视频 | 国内久久| 日韩成人不卡 | 黄色成年片| 免费看污网站 | 成人黄色电影免费观看 | 91.麻豆视频 | 在线观看av免费 | 成人97视频 | 在线免费观看一区二区三区 | 国产在线精品二区 | 97电影手机版 | 黄色三级av | 91在线精品视频 | 精品视频区 | 中文字幕91| 久久精品99北条麻妃 | 日韩精品在线视频免费观看 | 9999精品 | 黄色精品一区 | 小草av在线播放 | 91桃色在线播放 | 婷婷色网 | 久久999精品 | 黄色免费观看网址 | 日本中文在线 | 日韩高清免费在线观看 | 91精品国产九九九久久久亚洲 | 成人动漫精品一区二区 | 色五婷婷| 国内精品美女在线观看 | 狠狠的操| 色噜噜日韩精品欧美一区二区 | 91香蕉视频在线下载 | 91丨九色丨首页 | a午夜电影 | 国产精品婷婷 | 久久久91精品国产一区二区精品 | 日韩久久午夜一级啪啪 | 国产高清av免费在线观看 | 精品国产伦一区二区三区免费 | 夜夜骑天天操 | 中文字幕国产精品 | 六月婷婷色 | 国产理论片在线观看 | 91在线www| 五月婷婷色 | 国产99久久| 天天色天天操天天爽 | 国产高清小视频 | 九九久久成人 | 天堂av在线网址 | 中文字幕在线观看免费高清电影 | 欧美日韩一区二区视频在线观看 | 国产精品免费视频久久久 | 一区在线播放 | 黄色大全免费观看 | 成片视频在线观看 | 视频在线观看91 | 久久综合婷婷综合 | 久久久久国产成人免费精品免费 | 国产精品久久久久久a | 日韩免费小视频 | 色婷婷亚洲婷婷 | 国产亚洲精品美女久久 | 特级黄色视频毛片 | 美女在线免费观看视频 | 四虎国产精品免费观看视频优播 | 精品国产一区二区三区久久影院 | 成人av.com| 亚洲四虎在线 | 久久精品99国产精品日本 | 国产精品久久久久久久久久久久冷 | 蜜臀久久99精品久久久无需会员 | 韩日精品在线观看 | 久章草在线观看 | 在线中文字幕观看 | www.伊人网 | 91av视频观看| 99色在线播放 | 五月婷社区 | 波多野结衣在线观看视频 | 亚洲精品动漫成人3d无尽在线 | 精品视频在线视频 | 国产视频中文字幕在线观看 | 毛片网站在线 | 久久这里只有精品视频首页 | 国产成人在线观看免费 | 成人免费xxxxxx视频 | 亚洲成人高清在线 | 在线视频一区二区 | 久久露脸国产精品 | 黄色片网站免费 | 91在线最新 | 亚洲aⅴ免费在线观看 | 视频在线观看入口黄最新永久免费国产 | 欧美日韩久久 | 97看片网| 国产精品综合在线观看 | 91传媒视频在线观看 | 又黄又爽又刺激 | 欧美极品一区二区三区 | 日本在线观看一区二区三区 | 婷婷视频 | 天天天天天天天天操 | 亚洲伦理中文字幕 | 99久久精品日本一区二区免费 | 国产在线精品一区二区不卡了 | 日日干影院 | 日本精品久久久久中文字幕5 | 美腿丝袜av | 成人av电影在线播放 | av一级久久 | 中文字幕av最新 | 国偷自产中文字幕亚洲手机在线 | 黄色小说免费在线观看 | 久久av电影| 在线观看91视频 | 亚洲高清色综合 | 亚洲激情免费 | 激情深爱.com | 伊人成人久久 | 在线观看视频一区二区 | 国产视频一区在线播放 | 天海冀一区二区三区 | www麻豆视频 | 91视频91色| 欧日韩在线视频 | 又黄又爽又无遮挡免费的网站 | 超碰电影在线观看 | 日批视频国产 | 91视频免费国产 | 国内精品久久久久久久久久久 | 国产精品一区在线播放 | 五月天久久综合网 | 久色 网| 狠狠干五月天 | 夜夜婷婷 | 日韩高清一二区 | 激情婷婷综合 | 久久草在线免费 | 久久99在线视频 | 国产精品久久久久一区 | 国产精品区免费视频 | 日韩视频免费 | 久久免费电影网 | 日日夜夜天天干 | 91九色最新地址 | 国产精品乱码高清在线看 | 日韩二区在线观看 | 97超碰国产在线 | 精品国产电影一区 | 麻豆视频国产在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日本中文字幕在线电影 | 综合色站导航 | 国产系列精品av | 视频在线国产 | av一区在线| 亚洲麻豆精品 | 亚洲欧洲国产日韩精品 | 日韩视频免费在线观看 | 久久国内免费视频 | 69久久夜色精品国产69 | 日本电影久久 | av在线之家电影网站 | 天堂在线一区二区 | 日韩在线观看不卡 | 国产精品1000 | 国产四虎在线 | 国产精品99久久免费观看 | 丁香导航| 日日夜夜狠狠操 | 国产精品都在这里 | 日本女人b | 97色婷婷成人综合在线观看 | 日日夜夜骑 | 成人毛片a | 在线精品一区二区 | 精品女同一区二区三区在线观看 | 97超碰资源网| 中文字幕丰满人伦在线 | 国产黄色片免费观看 | 成年人国产精品 | 草久久av| 亚洲在线视频播放 | 四虎成人免费影院 | 免费日韩电影 | 国产精品美女久久久网av | 国产精品va在线 | 日本中文字幕在线一区 | 久久夜夜爽 | 伊人五月天 | 日日夜夜网站 | 激情av在线播放 | 国产欧美精品一区二区三区四区 | 丁香综合激情 | 国产一二区视频 | 亚洲精品久久久蜜桃直播 | 久久免费观看视频 | 日韩欧美视频在线观看免费 | 亚洲精品在线视频 | 99久热在线精品视频 | 久久久久久久久久久久久久免费看 | 欧美另类sm图片 | 日本精品一区二区三区在线观看 | 欧美美女激情18p | 成人免费在线播放 | 婷婷综合视频 | 午夜美女wwww | 五月婷婷另类国产 | 天天插狠狠插 | 久久麻豆精品 | 精品视频中文字幕 | 国产精品久久久久国产精品日日 | 福利视频一二区 | 日韩欧美在线高清 | 人人爽人人 | 精品久久免费看 | 日韩高清无线码2023 | 国产欧美日韩视频 | 国产精品欧美日韩在线观看 | 国产aaa免费视频 | 狠狠插天天干 | 中文字幕成人在线观看 | 天天爽夜夜爽人人爽一区二区 | 欧美极品少妇xxxx | 99精品视频在线播放观看 | 99综合视频| 黄色三级免费 | 国产福利电影网址 | av电影免费在线播放 | 婷婷综合久久 | 亚洲精品国偷自产在线99热 | a级一a一级在线观看 | 日韩在线观看视频一区二区三区 | 91九色成人蝌蚪首页 | 久久精品成人热国产成 | 欧美日在线 | 911精品美国片911久久久 | 视频在线播放国产 | 亚洲精品午夜视频 | 国产综合福利在线 | 美腿丝袜一区二区三区 | 久久精品国产一区二区三区 | 免费观看第二部31集 | 97高清免费视频 | 天天干,狠狠干 | 亚洲aⅴ一区二区三区 | 国产精品国产三级国产 | 一二区电影| 中文字幕欧美日韩va免费视频 | 久久久国产精品亚洲一区 | 亚洲欧美国产视频 | 国产午夜激情视频 | 亚洲专区一二三 | 精品播放 | 亚洲欧美日韩中文在线 | 国产精品第72页 | 日韩激情免费视频 | 米奇四色影视 | 十八岁以下禁止观看的1000个网站 | 欧美伦理一区二区 | 欧洲色吧 | 在线影视 一区 二区 三区 | 成人国产精品一区二区 | 天干啦夜天干天干在线线 | 亚洲欧美视频 | 伊人视频| av网站大全免费 | 一级黄色片在线观看 | 欧美成人免费在线 | 久久dvd| 一区在线电影 | 国产香蕉视频在线观看 | 国产中文a | 天天综合网在线 | 91福利视频免费 | 国产伦精品一区二区三区高清 | 国产精品99在线观看 | 一区二区三区国产精品 | 午夜狠狠操 | 亚洲国产中文字幕在线观看 | 一本色道久久综合亚洲二区三区 | 夜夜夜夜夜夜操 | 久久精品日韩 | 成人影音在线 | 99视频国产精品 | 久久精彩视频 | 亚洲视频在线播放 | 国产精品久久久久久久久久免费看 | 国产资源精品在线观看 | 中中文字幕av在线 | 激情视频在线高清看 | 亚洲精品成人 | 精品久久久久久国产 | 在线视频 成人 | 99久久精品国产一区二区成人 | 国产一级片一区二区三区 | 久久精品aaa | 国产伦精品一区二区三区高清 | 亚洲综合日韩在线 | 69国产盗摄一区二区三区五区 | 中文字幕中文字幕 | av电影不卡在线 | 夜夜夜草 | 欧美a级在线免费观看 | 亚洲视频免费在线观看 | 91色在线观看| 国产99久久久久久免费看 | 日韩免费电影一区二区三区 | 久久婷亚洲五月一区天天躁 | 免费在线观看中文字幕 | 看国产黄色片 | 日韩成人免费在线 | 美女久久视频 | 国产小视频免费在线观看 | 精品国产一区二区三区噜噜噜 | 综合精品久久 | 激情丁香 | 97人人模人人爽人人喊网 | 99视频国产精品免费观看 | 超碰在线9| 亚洲最大av | 最近中文字幕完整高清 | 在线小视频 | 亚洲欧洲久久久 | 国产免费视频一区二区裸体 | 亚洲精品永久免费视频 | 国产又粗又猛又色又黄视频 | 中文字幕在线视频网站 | 国产一区二区精品久久 | 日韩极品视频在线观看 | 久久久精品小视频 | 精品中文字幕在线播放 | 国产精品久久麻豆 | 亚洲婷婷在线 | av在线免费观看网站 | 免费午夜视频在线观看 | 国产超碰在线观看 | 五月天久久综合 | 中文字幕欧美三区 | 中文字幕在线高清 | 免费在线观看亚洲视频 | 人人爱人人做人人爽 | 国产精品毛片一区视频 | a天堂在线看| 日本黄色免费看 | 久久免费99 | 日韩伦理一区二区三区av在线 | 丁香六月网 | 一级黄色a视频 | 亚洲视频在线观看 | 国产欧美三级 | 国产精彩在线视频 | 午夜久久久久久久久久久 | 在线亚洲欧美视频 | 丁五月婷婷 | 黄色精品免费 | 久久综合狠狠综合久久狠狠色综合 | 亚洲天堂免费视频 | 亚洲黄色免费观看 | 色吊丝在线永久观看最新版本 | 久草精品视频在线观看 | 99精品国产一区二区 | 97成人免费视频 | 99亚洲精品视频 | 国产精品一区二区在线播放 | 国产午夜不卡 | 一区 二区电影免费在线观看 | 国产精品麻 | 日韩高清国产精品 | 成人黄视频 | 99久久久国产精品 | 日日干夜夜骑 | 国产精品尤物视频 | 911久久香蕉国产线看观看 | 国产精品女同一区二区三区久久夜 | 激情综合网色播五月 | 99精品久久99久久久久 | 中文字幕av一区二区三区四区 | 色就色,综合激情 | 久久夜av | 国产九九九视频 | 久久综合99| 久久综合干 | 中文字幕一区二区三区在线播放 | 波多野结衣在线观看一区二区三区 | 日本精品久久久一区二区三区 | 中文不卡视频 | 成人网在线免费视频 | 欧美日韩国产精品一区 | 欧美日韩在线视频观看 | 超碰97人人爱 | 国产精品二区三区 | 久久视频精品在线观看 | 亚洲专区免费观看 | 免费日韩av电影 | 日韩高清 一区 | 黄色国产在线观看 | 免费国产ww | 激情综合婷婷 | 欧美一级免费高清 | 日本精品视频免费观看 | 久久久久久久久久久网 | 中文字幕成人一区 | 五月花婷婷| 国产精品久久久久久久久费观看 | 国产精品亚洲综合久久 | 性色av一区二区 | 99国产精品久久久久久久久久 | 国产精品久久久久久久久久久久午 | 久久久免费看片 | www免费看 | 国产亚洲高清视频 | 操操日日| 九九九热精品免费视频观看网站 | 福利视频区 | 99人成在线观看视频 | 日本久久久久久科技有限公司 | 四虎国产精品免费观看视频优播 | 国产一区在线视频 | 亚洲免费小视频 | 狠狠操在线 | 91精品国产麻豆国产自产影视 | 日韩二区三区 | 国产成人在线看 | 久久97精品 | 香蕉在线观看 | 欧美精品在线一区二区 | 国产精品乱码久久久久久1区2区 | 色综合久久久久久久 | 久久一区二区三区国产精品 | 91精彩视频在线观看 | 亚洲免费观看在线视频 | 在线观看电影av | 久艹在线播放 | 亚洲资源一区 | 毛片无卡免费无播放器 | 久久久免费精品视频 | 美女黄色网在线播放 | 色综合五月天 | 欧美伦理电影一区二区 | 中文字幕乱码电影 | 国产精品21区 | 久久在线精品 | 97夜夜澡人人爽人人免费 | 日一日操一操 | 亚洲成人av电影在线 | 天堂在线一区 | 在线免费观看国产黄色 | 五月天综合激情 | 亚洲精品乱码久久久久久蜜桃不爽 | 久久精品网址 | 视频国产一区二区三区 | 在线观看免费视频你懂的 | 天天色天天射天天综合网 | 精品网站999www| 久久久久久久久久久影院 | 日韩精品视频在线观看免费 | 9ⅰ精品久久久久久久久中文字幕 | 日韩午夜剧场 | 亚洲精品国产精品国自产观看 | www91在线观看 | 久久久鲁 | 天天操天天射天天操 | 国产精品99久久久久的智能播放 | 中文字幕一区二区三区四区在线视频 | 一级淫片a| 亚洲精品国产精品国自产在线 | 天天插天天干 | 91成人区| 日韩一二三在线 | 久久综合欧美精品亚洲一区 | 日韩视频免费 | 久草在线免费新视频 | 天天操天天怕 | 91色吧 | 国产精品综合在线观看 | 免费在线播放黄色 | 亚洲精品国偷拍自产在线观看 | 久久久久亚洲天堂 | www黄| 九九有精品 | 国产91精品一区二区麻豆亚洲 | 超碰在线最新 | 亚洲精品福利在线观看 | 91一区在线观看 | 欧美日韩国产精品一区二区三区 | 亚洲成人av一区 | 国产精品美女久久久久久 | av成年人电影 | 99久久久久久久 | 97成人精品区在线播放 | 久久久久久国产一区二区三区 | 中文字幕日韩电影 | 国产香蕉在线 | av在线网站免费观看 | 亚色视频在线观看 | 亚洲天堂网在线播放 | 91九色网站 | 欧美久久久影院 | 天天色婷婷| 一区二区三区久久 | 日本中文字幕影院 | 久日视频 | 国产精品mv在线观看 | 亚洲国产中文字幕在线视频综合 | 欧美经典久久 | 色黄久久久久久 | 成人a级免费视频 | 国产婷婷精品av在线 | 国产精品一区二区三区电影 | 亚洲乱码一区 | 亚洲国产精品va在线 | 亚州av一区 | 亚洲国产精品久久久 | 国产精品无av码在线观看 | 亚洲精品乱码久久久久久写真 | 久久久精品高清 | 91香蕉国产| 国产精品久久久久久久久搜平片 | 成人免费xxxxxx视频 | 99久久久成人国产精品 | 在线99| 久久女教师 | 亚洲国内精品 | 狠狠色狠狠色综合日日92 | 国产99精品| 麻豆91网站 | 亚洲成人影音 | 久久久精品日本 | 99久久这里有精品 | 久久av在线播放 | 亚洲精品视频在线观看免费视频 | 久久综合久久综合这里只有精品 | 国产精品一级视频 | 日韩,中文字幕 | 精品一区二区在线免费观看 | 日本高清免费中文字幕 | 精品国产理论片 | 成人手机在线视频 | av网站免费看 | 国产成人精品久久久久 | 正在播放国产精品 | 在线播放91 | 国产在线精品一区二区三区 | 成人黄色大片网站 | 精品久久久久久亚洲综合网 | 在线天堂中文在线资源网 | 99久在线精品99re8热视频 | 久久玖 | 午夜精品久久久久 | 国产一区二区三区高清播放 | 国产视频在线播放 | www.久久com| 日韩在线视频一区 | 99久久精品免费一区 | 精品国产免费久久 | 91香蕉视频污在线 | 黄污在线观看 | www.色国产 | 免费国产在线精品 | 国产精品久久久久久五月尺 | 中文字幕亚洲高清 | 正在播放五月婷婷狠狠干 | 91精品国产91热久久久做人人 | 99综合电影在线视频 | 日韩aa视频| 亚洲天堂精品视频在线观看 | 欧美日韩高清在线观看 | 在线 精品 国产 | 天天操天天射天天插 | 亚洲国产偷| 亚洲乱码精品久久久 | 日日日天天天 | 国产一区免费观看 | 色在线视频 | 99精品视频在线观看视频 | 国产精品麻豆果冻传媒在线播放 | 午夜国产福利在线观看 | 亚洲伦理电影在线 | 亚洲永久精品视频 | 六月丁香婷婷在线 | 国产黄色成人av | 日韩精品视频免费专区在线播放 | 超碰av在线免费观看 | 免费看一级特黄a大片 | 五月婷婷视频在线观看 | 美女国产免费 | 毛片一级免费一级 | 亚洲黄色一级电影 | 久久久久五月天 | 五月天亚洲婷婷 | 欧美精品v国产精品v日韩精品 | 亚洲一区二区三区四区精品 | 最近高清中文字幕在线国语5 | 日韩黄色免费 | 婷婷午夜天 | 中文字幕av免费在线观看 | 97涩涩视频 | 碰碰影院 | 国产中文字幕免费 | 国产精品99久久久久久大便 | 五月综合激情 | 91九色蝌蚪在线 | 亚洲日韩中文字幕在线播放 | 欧美精品久久久久久久久久白贞 | 精品久久久久久久久久久久久久久久久久 | 国产精品久久久久久久久蜜臀 | 日日躁你夜夜躁你av蜜 | 91看片网址 | 久久视频网址 | 伊人电影天堂 | 91一区二区三区在线观看 | 国产精品久久久久久久久久久久午 | 欧美一区二区三区免费看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 久久久久福利视频 | 国产乱视频 | 精品国产伦一区二区三区观看方式 | 超碰在线国产 | 亚洲黄色一级电影 | 天天躁天天操 |