SwipeRefreshLayout中包裹一個可滑動的子控件,如ListView、RecyclerView等,可以實現(xiàn)豎直滑動時刷新頁面的需求,注意其布局只能包裹一個子控件,然后通過設(shè)置OnRefreshListener實現(xiàn)監(jiān)聽
但其沒有提供上拉加載更多的布局交互。這里通過這繼承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布局。