您的位置:首页 > 移动开发 > Android开发

RecyclerView检测是否滑动到底部

2016-05-12 23:09 423 查看
上一个博客http://blog.csdn.net/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到底了");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android recyclerview