一、Recycleview的上拉加载更多
mRecyclerview.addOnScrollListener(mOnScrollListener);
RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int itemCount = layoutManager.getItemCount();
int lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (lastPosition == itemCount - 1 && isLoadMore) {
//加载更多
loadMore();
}
}
};
二、Recycleview的预加载
一些时候在网络不流畅的情况下上拉加载比较缓慢,体验不太好,这时候就需要用到预加载了,比如说上拉加载每次加载20条数据,那么在用户滑到第15条的时候加载预加载下一条数据,这样用户滑到第20条时候数据已经显示出来了,不需要再次加载了,等于说提前了,这样体验更流畅。
在那块监听Recycleview的滑动显示的最后一条的item的位置信息呢?在上面的Recycleview上拉加载更多中mOnScrollListener的onScrolled能不能监听到呢?实际上是监听不到了的。在使用 layoutManager.findLastVisibleItemPosition()获取位置信息在和所需要加载时候的位置信息比较的时候,如果我们滑动的手速特别靠着惯性滑动,那么onScrolled不会执行,findLastVisibleItemPosition自然不会获取到数据,就会有遗漏,所有这个方法是行不通的。我们知道在Recycleview的onBindViewHolder方法中每次都会绑定数据,如果每次获取一次加载的位置和预加载的位置比较就会获得预加载条件,这样每次就能够预加载下一条数据,并且不会遗漏。
private boolean isScrolled = false;
@Override
public void onBindViewHolder(MyRecyclerHolder holder, int position) {
super.onBindViewHolder(holder, position);
if (isScrolled ) {
return;
}
//20表示每页加载20项数据,15表示从第六页开始加载
if (position % 20 == 15) {
//请求接口提前加载
request()
}
//onBindViewHolder会被执行多次,只有上滑时候在请求下一页,上滑就不执行预加载了
isScrolled = true;
}