【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能_第1頁
【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能_第2頁
【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能_第3頁
【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能_第4頁
【移動應用開發(fā)技術】在android應用中怎么添加一個上拉刷新下拉加載功能_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論