RecyclerView检测是否滑动到底部
2016-05-12 23:09
423 查看
上一个博客http://blog.csdn.net/oaitan/article/details/51165894
用到了recyclerview滑动到底部,
用的是LinearLayoutManager这个属性,当用到瀑布流的时候这个方法肯定不行了
用StaggeredGridLayoutManager这个属性因为item高低不一样,以前的老方法肯定就不行了,现在通过自定义recyclerView去检测是否滑动到底部,不管是这两个属性哪一个都可以检测到是否滑动到了底部
我用的自带的下拉刷新,有个isRefreshing(),返回是否在下拉刷新,
用到了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到底了"); } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories