前言
这里介绍了RecyclerView的下拉刷新和分页加载两项功能,别的请参照:
RecyclerView(一)
RecyclerView加点击事件(二)
RecyclerView之横向展示(四)
RecyclerView之瀑布流(五)
RecyclerView优化
下拉刷新
SwipeRefreshLayout
这是谷歌官方推荐的搭配的方法。
需要使用android.support.V4.widget.SwipeRefreshlayout
监听方法
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//在这里不会直接更新,还需要你手动去调用刷新的方法
}
});
可以设置刷新圆圈的颜色
swipeRefreshLayout.setColorSchemeColors(Color.RED,Color.BULE);
//这里面设置颜色最多是四个,可以实现转一个圈显示一个颜色
可以设置刷新圆圈出来的位置
swipeRefreshlayout.setProgressViewOffset(true,200,300);
//实现的功能是,true:会收缩,参数二是开始的位置,参数三是结束的位置
//形成一种收缩移动的动画既视感
可以设置圆圈消失
swipeRefreshlayout.setRefreshing(false);
分页加载
介绍
很多人直接会用系统提供的addOnScrollListener()方法,如下所示:
myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE){
/**new State 一共有三种状态
* SCROLL_STATE_IDLE:目前RecyclerView不是滚动,也就是静止
* SCROLL_STATE_DRAGGING:RecyclerView目前被外部输入如用户触摸输入。
* SCROLL_STATE_SETTLING:RecyclerView目前动画虽然不是在最后一个位置外部控制。
//这里进行加载更多数据的操作
}
}
});
弊端
上述方法类似与ViewPager的滑动监听,只要你一滑动RecyclerView,那么就会调用,
如上述的约束条件,只要动了,就会就会静止,就会调用,哪怕你没有到ReyclerView
数据的底部,所以不可取
解决
需要对这个监听进行约束,首先定义新的类,在Adaper类中,不是当做内部类
class OnlastItem extends RecyclerView.OnScrollListener{
boolean isButton =false;
}
//关键,一定要继承RecyclerView.OnScrollListener接口
在Adapter类中一定要重写onViewAttachedToWindow()方法
@Override
public void onViewAttachedToWindow(MyViewHodler holder) {
super.onViewAttachedToWindow(holder);
int positon = holder.getLayoutPosition();
if (positon == list.size()-1){
onlastItem.isButton =true;
}
}
上述方法介绍
Called when a view created by this adapter has been attached to a window.
这个方法会频繁的调用,只要一个屏幕外的item进入当前视野,就会调用,但是有一点需要注意的是,
window指的是当前可见的视图,一个item 哪怕,你只看到一点点,那么也算是进入了屏幕上了,
就是所谓的window 上了。
那么你初始化展示了RecyclerView的内容后,这个方法也会根据在window上可见的数目,调用相应的次数。
继续上述步骤
在Adapter类中:
//持有滑动的变量
private OnlastItem onlastItem;
//对外暴露其方法
public void setOnlastItem(OnlastItem onlastItem) {
this.onlastItem = onlastItem;
}
给RecyclerView设置监听方法
//滑动监听
OnlastItem on = new OnlastItem(){
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
/*当RecyclerView滚动。这将是
称为滚动后完成。这个回调也被称为后如果可见项目范围改变布局
计算。在这种情况下,dx和dy将0。
dx表示水平滚动,dy表示垂直滚动*/
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
要调用的回调方法当RecyclerView滚动状态改变。
/**new State 一共有三种状态
* SCROLL_STATE_IDLE:目前RecyclerView不是滚动。
* SCROLL_STATE_DRAGGING:RecyclerView目前被外部输入如用户触摸输入。
* SCROLL_STATE_SETTLING:RecyclerView目前动画虽然不是在最后一个位置
外部控制。
* */
if (newState == RecyclerView.SCROLL_STATE_IDLE&&isButton==true){
//这里用不是滚动状态的实现,并且还有一个判断,是退出屏幕了
if (newState == RecyclerView.SCROLL_STATE_IDLE){
//进行联网数据操作
isButton =false;//这个置反很关键
}
}
}
};
myRecyclerView.addOnScrollListener(on); //关键方法
liAdater.setOnlastItem(on); //关键方法
网友评论