在Android开发中,一个可以上下拉刷新的列表是非常常见的功能。在之前的项目中,一般都是使用ListView实现的,一般实现的原理都是跟ListView添加头尾视图 + 手势操作。
在AndroidV7包中出现RecycleView后,很多开发者就将ListView舍弃,直接使用RecycleView。
但是在项目中需要实现上下拉刷新的功能,所以,很有必要让RecycleView支持上下拉刷新。
网上搜的话,等搜出一大堆关于的RecycleViews上下拉的资料,但都是与 SwipeRefreshLayout 配合使用。但是SwipeRefreshLayout 下拉刷新的效果往往不符合项目的需求,大部分的需求效果类似于 androidPullToRefresh。所以我就考虑如何实现类似androidPullToRefresh的下拉刷新效果。
当我查看androidPullToRefresh 源码(之后简称源码)的时候发现,androidPullToRefresh 框架对上下拉的刷新操作封装的特别好,所以就直接使用androidPullToRefresh 框架。
在查看源码的发现,PullToRefreshWebView、PullToRefreshScrollView 都是继承自 PullToRefreshBase。而PullToRefreshBase主要是对上下拉的手势操作,以及上下拉的效果做了封装,我能不能直接继承PullToRefreshBase 来实现的我的功能呢?
在PullToRefreshBase 中有4个方法需要实现,实现这个方法,即可实现添加 上下拉效果了。 为androidPullToRefresh的作者32个赞!!!
具体的操作如下:
public class WanRecycleView extends PullToRefreshBase<RecyclerView> {
public WanRecycleView(Context context) {
super(context);
}
public WanRecycleView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WanRecycleView(Context context, Mode mode) {
super(context, mode);
}
public WanRecycleView(Context context, Mode mode, AnimationStyle animStyle) {
super(context, mode, animStyle);
}
//重写4个方法
//1 滑动方向
@Override
public Orientation getPullToRefreshScrollDirection() {
return Orientation.VERTICAL;
}
//重写4个方法
//2 滑动的View
@Override
protected RecyclerView createRefreshableView(Context context, AttributeSet attrs) {
RecyclerView view = new RecyclerView(context, attrs);
return view;
}
//重写4个方法
//3 是否滑动到底部
@Override
protected boolean isReadyForPullEnd() {
View view = getRefreshableView().getChildAt(getRefreshableView().getChildCount() - 1);
if (null != view) {
return getRefreshableView().getBottom() >= view.getBottom();
}
return false;
}
//重写4个方法
//4 是否滑动到顶部
@Override
protected boolean isReadyForPullStart() {
View view = getRefreshableView().getChildAt(0);
if (view != null) {
return view.getTop() >= getRefreshableView().getTop();
}
return false;
}
}
github:https://github.com/Wan7451/Wan_RecycleViewAdapter
这个组件的用法与PullToRefreshView 的用法一样,因为就是基于人家的框架写的。
mainView.setScrollingWhileRefreshingEnabled(true);
mainView.setMode(PullToRefreshBase.Mode.BOTH);
mainView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<RecyclerView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<RecyclerView> refreshView) {
Toast.makeText(MainActivity.this, "下拉刷新", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mainView.onRefreshComplete();
}
}, 4000);
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<RecyclerView> refreshView) {
Toast.makeText(MainActivity.this, "上拉加载", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mainView.onRefreshComplete();
}
}, 4000);
}
});