在android應(yīng)用中怎么添加一個(gè)上拉刷新下拉加載功能?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的資陽(yáng)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
下拉刷新
首先我們給出如下幾個(gè)參數(shù),后面要用:
private NestedScrollingParentHelper helper = null; private boolean IsRefresh = true; private boolean IsLoad = true; //滑動(dòng)的總距離 private int totalY = 0; private LinearLayout headerLayout = null; private MyRecyclerView myRecyclerView = null; private LinearLayout footerLayout = null;
既然是刷新,我們的滾動(dòng)肯定是在父view之前的。所以我們需要在onNestedPreScroll這個(gè)方法里面寫(xiě)上我們所需要改動(dòng)的x,y值。
我們需要用父view去攔截它。
我們需要判斷dy的值是否大于0,因?yàn)榇笥?是刷新操作,小于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;
}
}上拉加載
上面我也說(shuō)了onNestedPreScroll這個(gè)方法中判斷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滑動(dòng)結(jié)束后,實(shí)行如下操作:
//子view滑動(dòng)結(jié)束調(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);
}
}其實(shí)最主要的兩個(gè)方法已經(jīng)解決了,其他到?jīng)]什么了,這邊,我把nestedscrolling的8個(gè)接口的功能和自定義recyclerview放出來(lái)。已變大家參考。希望大家都能實(shí)現(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));
}幾個(gè)接口的實(shí)現(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的滾動(dòng)
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滑動(dòng)結(jié)束調(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
既然是自己寫(xiě)的刷新加載框架,總不能還有自定義layout中在放個(gè)recyclerview。多麻煩,自定義一個(gè),直接放在里面,然后分別放個(gè)header和footer 就沒(méi)必要每次有頁(yè)面用到刷新都要寫(xiě)一個(gè)布局。3個(gè)布局解決整個(gè)項(xiàng)目的刷新和加載。話(huà)不多說(shuō),代碼如下:
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();
// spanCount = gridLayoutManager.getSpanCount();
// }
// return ((itemCount - 1) / spanCount + 1) - (lastItem / spanCount + 1);
// }
private boolean isVertical() {
if (staggeredGridLayoutManager != null)
return staggeredGridLayoutManager.getOrientation() == StaggeredGridLayoutManager.VERTICAL;
else if (linearLayoutManager != null)
return linearLayoutManager.getOrientation() == LinearLayoutManager.VERTICAL;
else if (gridLayoutManager != null)
return gridLayoutManager.getOrientation() == GridLayoutManager.VERTICAL;
return false;
}
// public void onScrolled(int dx, int dy) {
// if (dy > 0 && !isScrollLoad) {
// if (oLior != null) {
// onScrollListener.scrollLoad(sc````````
`
``
llLoad());//傳遞滾動(dòng)到倒數(shù)第幾行
// }
// }
// }
}關(guān)于在android應(yīng)用中怎么添加一個(gè)上拉刷新下拉加載功能問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
分享名稱(chēng):在android應(yīng)用中怎么添加一個(gè)上拉刷新下拉加載功能
URL標(biāo)題:http://chinadenli.net/article44/ipdphe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、用戶(hù)體驗(yàn)、軟件開(kāi)發(fā)、Google、微信公眾號(hào)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)