上一个博客http://blog.youkuaiyun.com/oaitan/article/details/51165894
用到了recyclerview滑动到底部,
用的是LinearLayoutManager这个属性,当用到瀑布流的时候这个方法肯定不行了
用StaggeredGridLayoutManager这个属性因为item高低不一样,以前的老方法肯定就不行了,现在通过自定义recyclerView去检测是否滑动到底部,不管是这两个属性哪一个都可以检测到是否滑动到了底部
/**
* by 12406 on 2016/5/12.
*/
public class MyRecyclerView extends RecyclerView {
public enum LAYOUT_MANAGER_TYPE {
LINEAR,
GRID,
STAGGERED_GRID
}
private LAYOUT_MANAGER_TYPE layoutManagerType;
/**
* 最后一个的位置
*/
private int[] lastPositions;
/**
* 最后一个可见的item的位置
*/
private int lastVisibleItemPosition;
private LoadingData loadingData;
public void setLoadingData(LoadingData loadingData) {
this.loadingData = loadingData;
}
public MyRecyclerView(Context context) {
super(context);
}
public MyRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onScrolled(int dx, int dy) {
super.onScrolled(dx, dy);
LogUtils.i("onScrolled", dx + " " + dy);
RecyclerView.LayoutManager layoutManager = getLayoutManager();
if (layoutManagerType == null) {
if (layoutManager instanceof LinearLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
} else {
throw new RuntimeException(
"Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
}
}
switch (layoutManagerType) {
case LINEAR:
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
break;
case GRID:
lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
break;
case STAGGERED_GRID:
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
if (lastPositions == null) {
lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
}
staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
lastVisibleItemPosition = findMax(lastPositions);
break;
}
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
RecyclerView.LayoutManager layoutManager = getLayoutManager();
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
LogUtils.i("onScrollStateChanged", "visibleItemCount" + visibleItemCount);
LogUtils.i("onScrollStateChanged", "lastVisibleItemPosition" + lastVisibleItemPosition);
LogUtils.i("onScrollStateChanged", "totalItemCount" + totalItemCount);
if (visibleItemCount > 0 && state == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItemPosition == totalItemCount - 1 && loadingData != null) {
loadingData.onLoadMore();
}
}
private int findMax(int[] lastPositions) {
int max = lastPositions[0];
for (int value : lastPositions) {
if (value > max) {
max = value;
}
}
return max;
}
public interface LoadingData {
void onLoadMore();
}
}
自定义个接口当滑动到底部的时候会触发这个方法
我用的自带的下拉刷新,有个isRefreshing(),返回是否在下拉刷新,
@Override
public void onLoadMore() {
if (!srfLayout.isRefreshing()) {
LogUtils.i("MainFragment", "recyclerview到底了");
}
}