[开源学习_MeiZhi]RecyclerView滚动到底部自动加载下一页
源码片段来源: drakeet的MeiZhi 项目.
https://github.com/drakeet/Meizhi
绑定监听器
final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2,
StaggeredGridLayoutManager.VERTICAL); //瀑布流布局管理器
mRecyclerView.setLayoutManager(layoutManager);
mMeizhiListAdapter = new MeizhiListAdapter(this, mMeizhiList);
mRecyclerView.setAdapter(mMeizhiListAdapter);
mRecyclerView.addOnScrollListener(getOnBottomListener(layoutManager)); //添加滚动监听
监听器的实现
//滚动到底部自动加载下一页
RecyclerView.OnScrollListener getOnBottomListener(StaggeredGridLayoutManager layoutManager) {
return new RecyclerView.OnScrollListener() {
@Override public void onScrolled(RecyclerView rv, int dx, int dy) {
//是否到达底部, 因为是2列,所以参数是new int[2], 判断第二列显示的View的数量是否显示完全
boolean isBottom =layoutManager.findLastCompletelyVisibleItemPositions(new int[2])[1] >=
mMeizhiListAdapter.getItemCount() - PRELOAD_SIZE;
if (!mSwipeRefreshLayout.isRefreshing() && isBottom) {
if (!mIsFirstTimeTouchBottom) {
mSwipeRefreshLayout.setRefreshing(true); //显示刷新
mPage += 1; //加载下一页
loadData();
} else {
mIsFirstTimeTouchBottom = false;
}
}
}
};
}
API说明
StaggeredGridLayoutManager#findLastCompletelyVisibleItemPositions()的API说明:
/**
* Returns the adapter position of the last completely visible view for each span.
* <p> 返回每一列可见的最后一个view的位置的数组
* @param into An array to put the results into. If you don't provide any, LayoutManager will
* create a new one. 用来存放结果的数组into[]
* @return The adapter position of the last fully visible item in each span. If a span does not
* have any items, {@link RecyclerView#NO_POSITION} is returned for that span.
*/
public int[] findLastCompletelyVisibleItemPositions(int[] into) {
if (into == null) {
into = new int[mSpanCount]; //根据设置的spanCount来创建数组
} else if (into.length < mSpanCount) {
throw new IllegalArgumentException("Provided int[]'s size must be more than or equal"
+ " to span count. Expected:" + mSpanCount + ", array size:" + into.length);
}
for (int i = 0; i < mSpanCount; i++) {
into[i] = mSpans[i].findLastCompletelyVisibleItemPosition(); //每个span都是找到最后一个位置
}
return into;
}