SwipeRefreshLayout中包裹一個(gè)可滑動(dòng)的子控件,如ListView、RecyclerView等,可以實(shí)現(xiàn)豎直滑動(dòng)時(shí)刷新頁面的需求,注意其布局只能包裹一個(gè)子控件,然后通過設(shè)置OnRefreshListener實(shí)現(xiàn)監(jiān)聽
但其沒有提供上拉加載更多的布局交互。這里通過這繼承SwipeRefreshLayout定義SwipeRefreshLoadLayout,實(shí)現(xiàn)其包裹的ListView或RecyclerView具有上拉加載功能。
實(shí)現(xiàn):
1.于onLayout方法中獲取子控件,并于此對(duì)ListView或RecyclerView設(shè)置滑動(dòng)監(jiān)聽(mListView.setOnScrollListener / mRecyclerView.addOnScrollListener),這里可以通過設(shè)置SwipeRefreshLoadLayout中的一個(gè)自定義屬性type(0為L(zhǎng)istView,1為RecyclerView)來區(qū)分包裹的子控件類型
2.判斷用戶滑動(dòng)子控件距離是否滿足加載更多的條件,即:
①用戶是上拉操作 :dispatchTouchEvent(MotionEvent ev)中處理分發(fā)事件,可由此獲得相應(yīng)手指觸摸與抬起的對(duì)應(yīng)坐標(biāo),當(dāng)然在MotionEvent.ACTION_MOVE狀態(tài)下還應(yīng)判斷是否為上拉加載更多的狀態(tài)
&& ②當(dāng)前可見頁面item為最后一項(xiàng):
mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1)
((LinearLayoutManager)mRecyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == manager.getItemCount() -1;
&& ③不在加載狀態(tài)中
3.在加載更多時(shí)使子控件的加載更多的布局可見,加載完消失。在設(shè)置加載狀態(tài)時(shí):
①ListView的設(shè)置布局狀態(tài)比較簡(jiǎn)單,通過addFooterView(mFooterView) / removeFooterView(mFooterView)的方法就可實(shí)現(xiàn);
②RecyelerView沒有提供相應(yīng)的方法,我們需要通過繼承RecyclerView.Adapter自定義一個(gè)RecyclerViewAdapter,在列表數(shù)據(jù)最后一項(xiàng)通過判斷其ItemViewType添加一個(gè)上拉加載的Footer布局:
FooterView也為item,mSwitch為控制其顯示與否的開關(guān)
RecyclerViewAdapter中設(shè)置FooterView可見或不可見
然后在getItemViewType中通過判斷其是否為最后一項(xiàng)并且是否為加載狀態(tài)(即mSwitch為1)得到特定的ItemViewType
mSwitch為關(guān)鍵,于此判斷是否處于加載狀態(tài)開啟Footer
最后復(fù)寫RecyclerViewAdapter相應(yīng)onCreateViewHolder、onBindViewHolder方法通過ItemVIewType創(chuàng)建綁定相應(yīng)的ViewHolder來實(shí)現(xiàn)item的顯示與一個(gè)上拉加載的Footer布局。