一個實現(xiàn)上拉加載更多的 SwipeRefreshLoadLayout

SwipeRefreshLayout中包裹一個可滑動的子控件,如ListView、RecyclerView等,可以實現(xiàn)豎直滑動時刷新頁面的需求,注意其布局只能包裹一個子控件,然后通過設(shè)置OnRefreshListener實現(xiàn)監(jiān)聽

SwipRefreshLayout官網(wǎng)介紹

但其沒有提供上拉加載更多的布局交互。這里通過這繼承SwipeRefreshLayout定義SwipeRefreshLoadLayout,實現(xiàn)其包裹的ListView或RecyclerView具有上拉加載功能。

實現(xiàn):

1.于onLayout方法中獲取子控件,并于此對ListView或RecyclerView設(shè)置滑動監(jiān)聽(mListView.setOnScrollListener / mRecyclerView.addOnScrollListener),這里可以通過設(shè)置SwipeRefreshLoadLayout中的一個自定義屬性type(0為ListView,1為RecyclerView)來區(qū)分包裹的子控件類型

2.判斷用戶滑動子控件距離是否滿足加載更多的條件,即:

①用戶是上拉操作 :dispatchTouchEvent(MotionEvent ev)中處理分發(fā)事件,可由此獲得相應(yīng)手指觸摸與抬起的對應(yīng)坐標,當(dāng)然在MotionEvent.ACTION_MOVE狀態(tài)下還應(yīng)判斷是否為上拉加載更多的狀態(tài)

避免下拉刷新同時加載

&& ②當(dāng)前可見頁面item為最后一項:

mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1)

((LinearLayoutManager)mRecyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == manager.getItemCount() -1;

&& ③不在加載狀態(tài)中

3.在加載更多時使子控件的加載更多的布局可見,加載完消失。在設(shè)置加載狀態(tài)時:

①ListView的設(shè)置布局狀態(tài)比較簡單,通過addFooterView(mFooterView) / removeFooterView(mFooterView)的方法就可實現(xiàn);

②RecyelerView沒有提供相應(yīng)的方法,我們需要通過繼承RecyclerView.Adapter自定義一個RecyclerViewAdapter,在列表數(shù)據(jù)最后一項通過判斷其ItemViewType添加一個上拉加載的Footer布局:

FooterView也為item,mSwitch為控制其顯示與否的開關(guān)

RecyclerViewAdapter中設(shè)置FooterView可見或不可見

然后在getItemViewType中通過判斷其是否為最后一項并且是否為加載狀態(tài)(即mSwitch為1)得到特定的ItemViewType

mSwitch為關(guān)鍵,于此判斷是否處于加載狀態(tài)開啟Footer

最后復(fù)寫RecyclerViewAdapter相應(yīng)onCreateViewHolder、onBindViewHolder方法通過ItemVIewType創(chuàng)建綁定相應(yīng)的ViewHolder來實現(xiàn)item的顯示與一個上拉加載的Footer布局。

源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容