记一次SmartRefreshLayout+RecyclerView 实现上拉加载更多和下拉刷新心得。
SmartRefreshLayout是一个比较强大的上拉加载更多和下拉刷新库 (附链接:点击打开链接)
不详解SmartRefreshLayout和RecyclerView的使用方法。贴一部分代码出来
private void initView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
baseAdapter = new BaseAdapter(this, list);
baseAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
}
});
recyclerView.setAdapter(baseAdapter);
//设置 Header
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
//设置 Footer 为 球脉冲 样式
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));
refreshLayout.setEnableAutoLoadMore(true);
refreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDecider() {
@Override
public boolean canRefresh(View content) {
...
}
@Override
public boolean canLoadMore(View content) {
...
}
});
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
...
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(RefreshLayout refreshlayout) {
...
}
});
}
问题:
在实现 上拉加载更多 和 下拉刷新 时 遇到item不在顶端就执行了刷新的方法和数据item没有填满屏幕也执行了加载更多。
这里需要利用
SmartRefreshLayout中的setScrollBoundaryDecider()方法设置滚动边界判断。代码如下
refreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDecider() {
@Override
public boolean canRefresh(View content) {
if (recyclerView == null) return false;
if (recyclerView.computeVerticalScrollOffset()==0)
return true;
return false;
}
@Override
public boolean canLoadMore(View content) {
if (recyclerView == null) return false;
//获取recyclerView的高度
recyclerView.getHeight();
//整个View控件的高度
int scrollRange = recyclerView.computeVerticalScrollRange();
//当前屏幕之前滑过的距离
int scrollOffset = recyclerView.computeVerticalScrollOffset();
//当前屏幕显示的区域高度
int scrollExtent = recyclerView.computeVerticalScrollExtent();
int height = recyclerView.getHeight();
if(height>scrollRange){
return false;
}
if (scrollRange <=scrollOffset+scrollExtent){
return true;
}
return false;
}
});
这种方法原理其实很简单,而且也是View自带的方法。
image
omputeVerticalScrollExtent()是当前屏幕显示的区域高度,computeVerticalScrollOffset() 是当前屏幕之前滑过的距离,而computeVerticalScrollRange()是整个View控件的高度。
所以我们只要通过判断Scroll和RecycleView的高度来判断是否在顶端和item是否达到了底端。
在setScrollBoundaryDecider()方法中new ScrollBoundaryDecider(),并重写canLoadMore和canRefresh方法。
代码不做讲解,就是简单的算法。
网友评论