版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能
在android應用中怎么添加一個上拉刷新下拉加載功能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。下拉刷新首先我們給出如下幾個參數(shù),后面要用:
private
NestedScrollingParentHelper
helper
=
null;
private
boolean
IsRefresh
=
true;
private
boolean
IsLoad
=
true;
//滑動的總距離
private
int
totalY
=
0;
private
LinearLayout
headerLayout
=
null;
private
MyRecyclerView
myRecyclerView
=
null;
private
LinearLayout
footerLayout
=
null;既然是刷新,我們的滾動肯定是在父view之前的。所以我們需要在onNestedPreScroll這個方法里面寫上我們所需要改動的x,y值。我們需要用父view去攔截它。我們需要判斷dy的值是否大于0,因為大于0是刷新操作,小于0是加載操作。然后我們需要判斷recyclerview是否是縱向的而不是橫向的。public
void
onNestedPreScroll(View
target,
int
dx,
int
dy,
int[]
consumed)
{
if
(IsRefresh)
{
if
(dy
>
0)
{
if
(myRecyclerView.isOrientation(0))
{
totalY
+=
dy;
if
((totalY
/
2)
<=
0)
{
scrollTo(0,
totalY
/
2);
consumed[1]
=
dy;
}
else
{
scrollTo(0,
0);
consumed[1]
=
0;
}
}
return;
}
}上拉加載上面我也說了onNestedPreScroll這個方法中判斷dy<0才是加載操作。所以綜上所述,代碼變成了這樣:
public
void
onNestedPreScroll(View
target,
int
dx,
int
dy,
int[]
consumed)
{
if
(totalY
<
0
&&
myRecyclerView.isOrientation(0)
||
totalY
>
0
&&
myRecyclerView.isOrientation(1))
{
isfling
=
true;
}
if
(IsRefresh)
{
if
(dy
>
0)
{
if
(myRecyclerView.isOrientation(0))
{
totalY
+=
dy;
if
((totalY
/
2)
<=
0)
{
scrollTo(0,
totalY
/
2);
consumed[1]
=
dy;
}
else
{
scrollTo(0,
0);
consumed[1]
=
0;
}
}
return;
}
}
if
(IsLoad)
{
if
(dy
<
0)
{
if
(myRecyclerView.isOrientation(1))
{
totalY
+=
dy;
if
((totalY
/
2)
>=
0)
{
scrollTo(0,
totalY
/
2);
consumed[1]
=
dy;
}
else
{
scrollTo(0,
0);
consumed[1]
=
0;
}
}
return;
}
}
}最后我們需要在子view滑動結束后,實行如下操作:
//子view滑動結束調(diào)用
//dyUnconsumed
<
0
向下滾
//dyUnconsumed
>
0
向上滾
public
void
onNestedScroll(View
target,
int
dxConsumed,
int
dyConsumed,
int
dxUnconsumed,
int
dyUnconsumed)
{
if
(dyUnconsumed
!=
0)
{
totalY
+=
dyUnconsumed;
scrollTo(0,
totalY
/
2);
}
}其實最主要的兩個方法已經(jīng)解決了,其他到?jīng)]什么了,這邊,我把nestedscrolling的8個接口的功能和自定義recyclerview放出來。已變大家參考。希望大家都能實現(xiàn)自己的刷新加載。告別swiperefreshlayout。添加header和footer這里我們參考listview自帶的addheaderview和addfooterview。代碼如下:
public
void
addHeaderView(View
headerView,
int
headerHeight)
{
this.headerLayout.removeAllViews();
this.headerLayout.addView(headerView);
LayoutParams
layoutParams
=
new
LayoutParams(LayoutParams.MATCH_PARENT,
headerHeight);
layoutParams.topMargin
=
-headerHeight;
this.headerLayout.setLayoutParams(layoutParams);
}
public
void
addFooterView(View
footerView,
int
footerHeight)
{
this.footerLayout.removeAllViews();
this.footerLayout.addView(footerView);
this.footerLayout.setLayoutParams(new
LayoutParams(LayoutParams.MATCH_PARENT,
footerHeight));
}幾個接口的實現(xiàn)
public
boolean
onStartNestedScroll(View
child,
View
target,
int
nestedScrollAxes)
{
return
true;
}
public
void
onNestedScrollAccepted(View
child,
View
target,
int
axes)
{
helper.onNestedScrollAccepted(child,
target,
axes);
}
//父view攔截子view的滾動
public
void
onNestedPreScroll(View
target,
int
dx,
int
dy,
int[]
consumed)
{
if
(totalY
<
0
&&
myRecyclerView.isOrientation(0)
||
totalY
>
0
&&
myRecyclerView.isOrientation(1))
{
isfling
=
true;
}
if
(IsRefresh)
{
if
(dy
>
0)
{
if
(myRecyclerView.isOrientation(0))
{
totalY
+=
dy;
if
((totalY
/
2)
<=
0)
{
scrollTo(0,
totalY
/
2);
consumed[1]
=
dy;
}
else
{
scrollTo(0,
0);
consumed[1]
=
0;
}
}
return;
}
}
if
(IsLoad)
{
if
(dy
<
0)
{
if
(myRecyclerView.isOrientation(1))
{
totalY
+=
dy;
if
((totalY
/
2)
>=
0)
{
scrollTo(0,
totalY
/
2);
consumed[1]
=
dy;
}
else
{
scrollTo(0,
0);
consumed[1]
=
0;
}
}
return;
}
}
}
//子view滑動結束調(diào)用
//dyUnconsumed
<
0
向下滾
//dyUnconsumed
>
0
向上滾
public
void
onNestedScroll(View
target,
int
dxConsumed,
int
dyConsumed,
int
dxUnconsumed,
int
dyUnconsumed)
{
if
(dyUnconsumed
!=
0)
{
totalY
+=
dyUnconsumed;
scrollTo(0,
totalY
/
2);
}
}
public
void
onStopNestedScroll(View
child)
{
helper.onStopNestedScroll(child);
if
(onTouchUpListener
!=
null)
{
isfling
=
false;
onTouchUpListener.touchUp();
}
}
public
boolean
onNestedFling(View
target,
float
velocityX,
float
velocityY,
boolean
consumed)
{
return
isfling;
}
public
boolean
onNestedPreFling(View
target,
float
velocityX,
float
velocityY)
{
return
isfling;
}
public
int
getNestedScrollAxes()
{
return
helper.getNestedScrollAxes();
}自定義recyclerview既然是自己寫的刷新加載框架,總不能還有自定義layout中在放個recyclerview。多麻煩,自定義一個,直接放在里面,然后分別放個header和footer就沒必要每次有頁面用到刷新都要寫一個布局。3個布局解決整個項目的刷新和加載。話不多說,代碼如下:
private
class
MyRecyclerView
extends
RecyclerView
{
private
StaggeredGridLayoutManager
staggeredGridLayoutManager
=
null;
private
LinearLayoutManager
linearLayoutManager
=
null;
private
GridLayoutManager
gridLayoutManager
=
null;
private
boolean
isScrollLoad
=
false;
private
boolean
isScrollRefresh
=
false;
public
MyRecyclerView(Context
context)
{
super(context);
setVerticalFadingEdgeEnabled(false);
setHorizontalFadingEdgeEnabled(false);
setVerticalScrollBarEnabled(false);
setHorizontalScrollBarEnabled(false);
setOverScrollMode(OVER_SCROLL_NEVER);
setItemAnimator(new
DefaultItemAnimator());
}
private
void
setMyLayoutManager(LayoutManager
layoutManager)
{
if
(layoutManager
instanceof
StaggeredGridLayoutManager)
{
staggeredGridLayoutManager
=
(StaggeredGridLayoutManager)
layoutManager;
}
else
if
(layoutManager
instanceof
GridLayoutManager)
{
gridLayoutManager
=
(GridLayoutManager)
layoutManager;
}
else
if
(layoutManager
instanceof
LinearLayoutManager)
{
linearLayoutManager
=
(LinearLayoutManager)
layoutManager;
}
setLayoutManager(layoutManager);
if
(!isVertical())
{
throw
new
NullPointerException("vertical!");
}
}
private
boolean
isOrientation(int
orientation)
{//orientation,0代表向下,1代表向上
if
(orientation
==
0)
return
isCanPullDown();
else
if
(orientation
==
1)
return
isCanPullUp();
return
false;
}
private
boolean
isCanPullDown()
{
return
!canScrollVertically(-1);
}
private
boolean
isCanPullUp()
{
return
!canScrollVertically(1);
}
//
private
int
scrollLoad()
{
//
int
lastItem
=
0;
//
int
itemCount
=
0;
//
int
spanCount
=
1;
//
if
(staggeredGridLayoutManager
!=
null)
{
//
lastItem
=
staggeredGridLayoutManager.findLastVisibleItemPositions(null)[0];
//
itemCount
=
staggeredGridLayoutManager.getItemCount();
//
spanCount
=
staggeredGridLayoutManager.getSpanCount();
//
}
else
if
(linearLayoutManager
!=
null)
{
//
lastItem
=
linearLayoutManager.findLastVisibleItemPosition();
//
itemCount
=
linearLayoutManager.getItemCount();
//
spanCount
=
1;
//
}
else
if
(gridLayoutManager
!=
null)
{
//
lastItem
=
gridLayoutManager.findLastVisibleItemPosition();
//
itemCount
=
gridLayoutManager.getItemCount();
/
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度養(yǎng)老院食堂與便利店運營管理合同4篇
- 2025年度生態(tài)農(nóng)業(yè)大棚使用權轉(zhuǎn)讓合同模板4篇
- 2025年度文化產(chǎn)品代理采購合同模板4篇
- 2024版英文技術服務合同范本規(guī)范
- 2024進戶門銷售合同
- 2024訴訟代理委托合同范本
- 2025年度專業(yè)論壇會議組織合同范本4篇
- 2025年度數(shù)字音樂詞曲版權交易合作合同范本4篇
- 2025年度新能源汽車項目代理投標合同樣本4篇
- 2024施工簡易合同范本(橋梁檢測與維修)3篇
- 中國的世界遺產(chǎn)智慧樹知到期末考試答案2024年
- 2023年貴州省銅仁市中考數(shù)學真題試題含解析
- 世界衛(wèi)生組織生存質(zhì)量測量表(WHOQOL-BREF)
- 《葉圣陶先生二三事》第1第2課時示范公開課教學PPT課件【統(tǒng)編人教版七年級語文下冊】
- 某送電線路安全健康環(huán)境與文明施工監(jiān)理細則
- GB/T 28885-2012燃氣服務導則
- PEP-3心理教育量表-評估報告
- 控制性詳細規(guī)劃編制項目競爭性磋商招標文件評標辦法、采購需求和技術參數(shù)
- 《增值稅及附加稅費申報表(小規(guī)模納稅人適用)》 及其附列資料-江蘇稅務
- 中南民族大學中文成績單
- 危大工程安全管理措施方案
評論
0/150
提交評論