日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上)

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們知道頁面的下拉刷新目前基本已經成為智能移動終端的標配刷新方式。Twitter設計出現有的下拉刷新(在2013年申請了專利)。

下拉刷新1.jpg

這一優美而又簡單的刷新方式,很快使得各大系統紛紛效仿;IOS在6.0開始引入,Android由于一開始不太重視交互體驗這方面,直到Android5.0開始才借鑒這樣一種刷新方式。那么我們今天就來研究研究怎么實現。

目前我收集到的不同方式有以下幾種:

方案一: listview headview調用setPadding的方式

方案二: listview的多種樣式顯示 getview 實現

方案三: SwipeRefreshLayout實現下來刷新 沒有加載更多

方案四:使用PullToRefresh 實現上拉加載和下拉刷新

方案五:使用Ultra-Pull-To-Refresh實現上拉加載和下拉刷新 類似方案三沒有加載更多

我們首先講解第一種實現方式,也是我們項目當中經常用到的。

實現思路:

1、首先為ListView添加頭布局和底布局,addHeadView()

2、通過改變HeaderView的paddingTop值,來控制控件的顯示和隱藏

3、根據我們滑動的狀態,動態修改頭部布局。

listview.png

完整的刷新過程:

1、下拉刷新——2、釋放刷新——3、刷新中——1、下拉刷新

也就是分3種狀態,那么分別什么時候切換狀態呢。看以下具體分析:

listview狀態圖.png

1、下拉刷新——釋放刷新:

當headView的paddingTop的值從-headViewHeight減小到0時,說明此刻為釋放刷新;

2、釋放刷新——刷新中:

headView的paddingTop一直大于0時,此時松開手指,將headView固定在paddingTop為0的位置,此時也是剛好請求網絡的時機。

3、刷新中——下拉刷新:

刷新結束,paddingTop值由0重新回到-headViewHeight

代碼實現邏輯:

1、實現 OnScrollListener 接口,在 onScroll() 方法中記錄當前是否到頂部或者底部;

2、重寫 onTouchEvent() 方法,通過moveY - downY得到偏移量,將偏移量設置為HeadView的paddingTop,使HeadView跟隨手指移動產生變化;

3、onScrollStateChanged() 方法中根據狀態變化(開始滾動或停止滾動),判斷是否需要加載更多。

4、定義了回調接口,讓用戶自己編寫下拉刷新的業務代碼;

完整代碼:

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (scrollState == OnScrollListener.SCROLL_STATE_IDLE

|| scrollState == OnScrollListener.SCROLL_STATE_FLING) {

if (isScroll2Bottom && !isLoadMoving) { // 滾動到底部

// 加載更多

if (!canLoadMore) {

return;

}

footerView.setPadding(0, 0, 0, 0);

this.setSelection(this.getCount()); // 滾動到ListView的底部

isLoadMoving = true;

//回調接口執行請求加載

if (mOnRefreshListener != null) {

mOnRefreshListener.onLoadingMore();

}

}

}

}

@Override

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

mFirstVisibleItem = firstVisibleItem;

isScroll2Bottom = (firstVisibleItem + visibleItemCount) >= totalItemCount

&& totalItemCount > 0;

}

public boolean onTouchEvent(MotionEvent ev) {

if (isEnd) {//如果現在時結束的狀態,即刷新完畢了,可以再次刷新了,在onRefreshComplete中設置

if (isRefreable) {//如果現在是可刷新狀態 在setOnMeiTuanListener中設置為true

switch (ev.getAction()) {

//用戶按下

case MotionEvent.ACTION_DOWN:

//如果當前是在listview頂部并且沒有記錄y坐標

if (mFirstVisibleItem == 0 && !isRecord) {

//將isRecord置為true,說明現在已記錄y坐標

isRecord = true;

//將當前y坐標賦值給startY起始y坐標

startY = ev.getY();

}

break;

//用戶滑動

case MotionEvent.ACTION_MOVE:

//再次得到y坐標,用來和startY相減來計算offsetY位移值

float tempY = ev.getY();

//再起判斷一下是否為listview頂部并且沒有記錄y坐標

if (mFirstVisibleItem == 0 && !isRecord) {

isRecord = true;

startY = tempY;

}

//如果當前狀態不是正在刷新的狀態,并且已經記錄了y坐標

if (state != REFRESHING && isRecord) {

//計算y的偏移量

offsetY = tempY - startY;

//如果當前的狀態是放開刷新,并且已經記錄y坐標

if (state == RELEASE_TO_REFRESH && isRecord) {

setSelection(0);

//如果當前滑動的距離小于headerView的總高度

if (-mHeaderViewHeight + offsetY / RATIO < 0) {

//將狀態置為下拉刷新狀態

state = PULL_TO_REFRESH;

//根據狀態改變headerView,主要是更新動畫和文字等信息

changeHeaderByState(state);

//如果當前y的位移值小于0,即為headerView隱藏了

} else if (offsetY <= 0) {

//將狀態變為done

state = DONE;

//根據狀態改變headerView,主要是更新動畫和文字等信息

changeHeaderByState(state);

}

}

//如果當前狀態為下拉刷新并且已經記錄y坐標

if (state == PULL_TO_REFRESH && isRecord) {

setSelection(0);

//如果下拉距離大于等于headerView的總高度

if (-mHeaderViewHeight + offsetY / RATIO >= 0) {

//將狀態變為放開刷新

state = RELEASE_TO_REFRESH;

//根據狀態改變headerView,主要是更新動畫和文字等信息

changeHeaderByState(state);

//如果當前y的位移值小于0,即為headerView隱藏了

} else if (offsetY <= 0) {

//將狀態變為done

state = DONE;

//根據狀態改變headerView,主要是更新動畫和文字等信息

changeHeaderByState(state);

}

}

//如果當前狀態為done并且已經記錄y坐標

if (state == DONE && isRecord) {

//如果位移值大于0

if (offsetY >= 0) {

//將狀態改為下拉刷新狀態

state = PULL_TO_REFRESH;

}

}

//如果為下拉刷新狀態

if (state == PULL_TO_REFRESH) {

//則改變headerView的padding來實現下拉的效果

headerView.setPadding(0, (int) (-mHeaderViewHeight + offsetY / RATIO), 0, 0);

}

//如果為放開刷新狀態

if (state == RELEASE_TO_REFRESH) {

//改變headerView的padding值

headerView.setPadding(0, (int) (-mHeaderViewHeight + offsetY / RATIO), 0, 0);

}

}

break;

//當用戶手指抬起時

case MotionEvent.ACTION_UP:

//如果當前狀態為下拉刷新狀態

if (state == PULL_TO_REFRESH) {

//平滑的隱藏headerView

headerView.setPadding(0, -mHeaderViewHeight, 0, 0);

//根據狀態改變headerView

changeHeaderByState(state);

}

//如果當前狀態為放開刷新

if (state == RELEASE_TO_REFRESH) {

//平滑的滑到正好顯示headerView

headerView.setPadding(0, -mHeaderViewHeight, 0, 0);

//將當前狀態設置為正在刷新

state = REFRESHING;

//回調接口的onRefresh方法

if (mOnRefreshListener != null) {

mOnRefreshListener.onRefresh();

}

//根據狀態改變headerView

changeHeaderByState(state);

}

//這一套手勢執行完,一定別忘了將記錄y坐標的isRecord改為false,以便于下一次手勢的執行

isRecord = false;

break;

}

}

}

return super.onTouchEvent(ev);

}

那么到此,我們就把下拉刷新分析完了。

總結

以上是生活随笔為你收集整理的android listview下拉刷新动画,ListView下拉刷新实现方式详解和改造(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

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