SwipeRefreshLayout中包裹一个可滑动的子控件,如ListView、RecyclerView等,可以实现竖直滑动时刷新页面的需求,注意其布局只能包裹一个子控件,然后通过设置OnRefreshListener实现监听
但其没有提供上拉加载更多的布局交互。这里通过这继承SwipeRefreshLayout定义SwipeRefreshLoadLayout,实现其包裹的ListView或RecyclerView具有上拉加载功能。
实现:
1.于onLayout方法中获取子控件,并于此对ListView或RecyclerView设置滑动监听(mListView.setOnScrollListener / mRecyclerView.addOnScrollListener),这里可以通过设置SwipeRefreshLoadLayout中的一个自定义属性type(0为ListView,1为RecyclerView)来区分包裹的子控件类型
2.判断用户滑动子控件距离是否满足加载更多的条件,即:
①用户是上拉操作 :dispatchTouchEvent(MotionEvent ev)中处理分发事件,可由此获得相应手指触摸与抬起的对应坐标,当然在MotionEvent.ACTION_MOVE状态下还应判断是否为上拉加载更多的状态
&& ②当前可见页面item为最后一项:
mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() -1)
((LinearLayoutManager)mRecyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == manager.getItemCount() -1;
&& ③不在加载状态中
3.在加载更多时使子控件的加载更多的布局可见,加载完消失。在设置加载状态时:
①ListView的设置布局状态比较简单,通过addFooterView(mFooterView) / removeFooterView(mFooterView)的方法就可实现;
②RecyelerView没有提供相应的方法,我们需要通过继承RecyclerView.Adapter自定义一个RecyclerViewAdapter,在列表数据最后一项通过判断其ItemViewType添加一个上拉加载的Footer布局:
FooterView也为item,mSwitch为控制其显示与否的开关
RecyclerViewAdapter中设置FooterView可见或不可见
然后在getItemViewType中通过判断其是否为最后一项并且是否为加载状态(即mSwitch为1)得到特定的ItemViewType
mSwitch为关键,于此判断是否处于加载状态开启Footer
最后复写RecyclerViewAdapter相应onCreateViewHolder、onBindViewHolder方法通过ItemVIewType创建绑定相应的ViewHolder来实现item的显示与一个上拉加载的Footer布局。