打造Android万能上拉下拉刷新框架--XRefreshView(三)
2016-03-23 21:47
716 查看
转载请注明出处:http://blog.csdn.net/footballclub/
打造Android万能上拉下拉刷新框架–XRefreshView(一)
打造Android万能上拉下拉刷新框架–XRefreshView(二)
1. 处理listview滑动删除与XRefreshView的冲突
2. 处理viewpager和XRefreshView的冲突
3. listview滑动究竟部自己主动载入很多其它
4. 刷新时,不让里面的listview上下滑动
5. 自己定义headerview和footerview
6. 配置自己定义头部广告位
除了广告位的都已经完毕了。除此之外,我还对默认的header和footer做了ui上的优化,特别地,鉴于Recylerview的强大,我还针对Recylerview做了特别的适配,接下来先看效果图。在模拟器上录的。有点卡卡的。
能够调用setMoveForHorizontal并传入true就可以。
true会自己主动载入很多其它,false则相反。传入false的话。假设是listview。须要上拉才干载入很多其它。假设是Recylerview。则会须要点击才干载入很多其它。就像这样
点击载入很多其它涉及到自己定义footerview。到后面再说,这里先放着。
能够在activity的onResume()中调用。也能够在button的点击事件中调用。
当调用xRefreshView.setLoadComplete(true)以后,就会隐藏footerview;假设过段时间又有新的数据了。能够调用xRefreshView.setLoadComplete(false)。这样就又能够正常载入很多其它了。
这里须要介绍下几种headerview的状态
Created with Raphaël 2.1.0normalnormalreadyreadyrefreshingrefreshingfinishfinishheader移动的距离大于header的高度header移动的距离小于header的高度松手进入refreshing状态刷新完毕进入finish状态,此过程header被固定着此时header開始回弹,至全然隐藏时,状态变成normal
XRefreshView提供了不同状态的回调,方便开发人员依据状态来改变headerview的显示,同一时候为了提供更加强大的支持。XRefreshView提供了onHeaderMove(double offset, int offsetY)回调来返回当前headerview移动的信息。这样能够更加自由的定制headerview。在继承了View并实现了IHeaderCallBack接口以后,须要调用以下这种方法来设置自己定义headerview
footerview的状态流程分成两种
1.当到达底部自己主动载入很多其它:
1.1.还有很多其它数据
refreshing–>finish–>refreshing
1.2.已无很多其它数据
refreshing–>finish–>complete
2.当到达底部不自己主动载入很多其它:
2.1.还有很多其它数据
ready–>refreshing–>finish–>refreshing
2.2.已无很多其它数据
ready–>refreshing–>finish–>complete
当中,当不是到达底部自己主动载入很多其它的时候,须要自己写点击事件,就像这样:
给footer设置点击事件。在点击事件中直接回调onLoadMore。而且进入刷新状态。
还有就是footer的show和hide方法不能向header那样:
直接gone会给列表底部留下空白。所以应该这样
最后也须要通过以下这种方法来设置自己定义footerview
注:眼下上拉载入很多其它仅仅支持Linearlayoutmanager。我还在找解决的方法。
UltimateRecyclerView
android-Ultra-Pull-To-Refresh
打造Android万能上拉下拉刷新框架–XRefreshView(一)
打造Android万能上拉下拉刷新框架–XRefreshView(二)
XRefreshView更新说明
这段时间一直有朋友给我反馈,让我帮忙解决这个问题,我汇总了下,有以下几种:1. 处理listview滑动删除与XRefreshView的冲突
2. 处理viewpager和XRefreshView的冲突
3. listview滑动究竟部自己主动载入很多其它
4. 刷新时,不让里面的listview上下滑动
5. 自己定义headerview和footerview
6. 配置自己定义头部广告位
除了广告位的都已经完毕了。除此之外,我还对默认的header和footer做了ui上的优化,特别地,鉴于Recylerview的强大,我还针对Recylerview做了特别的适配,接下来先看效果图。在模拟器上录的。有点卡卡的。
效果图
更新具体
1.处理横向移动与XRefreshView的冲突
假设须要在手指横向移动的时候。让XRefreshView不拦截事件,xRefreshView.setMoveForHorizontal(true);
能够调用setMoveForHorizontal并传入true就可以。
2.滑动究竟部自己主动载入很多其它
眼下仅仅做了Abslistview和Recylerview的xRefreshView.setAutoLoadMore(false);
true会自己主动载入很多其它,false则相反。传入false的话。假设是listview。须要上拉才干载入很多其它。假设是Recylerview。则会须要点击才干载入很多其它。就像这样
点击载入很多其它涉及到自己定义footerview。到后面再说,这里先放着。
3.刷新时,不让里面的列表上下滑动
假设刷新时不想让里面的列表滑动。能够这么设置xRefreshView.setPinnedContent(true);
4.支持button点击開始刷新
XRefreshView不仅支持手势下拉刷新,也支持button点击開始刷新。xRefreshView.startRefresh();
能够在activity的onResume()中调用。也能够在button的点击事件中调用。
5.设置Abslistview和Recylerview的滚动监听事件
假设你有设置Abslistview和Recylerview滚动监听事件的须要的话,就不能直接使用Abslistview和Recylerview的setOnScrollListener方法了。由于为了实现自己主动载入很多其它的功能。监听已经被XRefreshView使用了,所以这时候须要使用XRefreshView提供的设置滚动监听的方法/** * 设置Abslistview的滚动监听事件 * * @param listener */ public void setOnAbsListViewScrollListener(OnScrollListener scrollListener) { mContentView.setOnAbsListViewScrollListener(scrollListener); } /** * 设置Recylerview的滚动监听事件 */ public void setOnRecyclerViewScrollListener( RecyclerView.OnScrollListener scrollListener) { mContentView.setOnRecyclerViewScrollListener(scrollListener); }
6.设置载入很多其它
假设希望在载入很多其它数据的时候。能在没有新数据的时候。隐藏footerview的话,new Handler().postDelayed(new Runnable() { public void run() { //模拟数据载入完毕 if (mLoadCount >= 3) { xRefreshView.setLoadComplete(true); } adapter.insert(new Person("More ", "21"), adapter.getAdapterItemCount()); adapter.insert(new Person("More ", "21"), adapter.getAdapterItemCount()); adapter.insert(new Person("More ", "21"), adapter.getAdapterItemCount()); mLoadCount++; //刷新完毕必须调用此方法停止载入 xRefreshView.stopLoadMore(); } }, 1000);
当调用xRefreshView.setLoadComplete(true)以后,就会隐藏footerview;假设过段时间又有新的数据了。能够调用xRefreshView.setLoadComplete(false)。这样就又能够正常载入很多其它了。
7.其它一些属性的设置
/** * 设置headerview回滚的时间,默认400毫秒 * * @param during */ public void setScrollDuring(int during) { SCROLL_DURATION = during; } /** * 设置阻尼系数,建议使用默认的 * * @param ratio * 默认 1.8 */ public void setDampingRatio(float ratio) { OFFSET_RADIO = ratio; } /** * 设置当下拉刷新完毕以后。headerview和footerview被固定的时间 * 注:考虑到ui效果,仅仅有时间大于1s的时候,footerview被固定的效果才会生效 * * @param pinnedTime */ public void setPinnedTime(int pinnedTime) { mPinnedTime = pinnedTime; mContentView.setPinnedTime(pinnedTime); }
8.XRefreshView提供的监听
public interface XRefreshViewListener { /** * 下拉刷新的回调 */ public void onRefresh(); /** * 上拉载入很多其它的回调 */ public void onLoadMore(); /** * 用户手指释放的监听回调 * * @param direction * >0: 下拉释放。<0:上拉释放 注:临时没有使用这种方法 */ public void onRelease(float direction); /** * 获取headerview显示的高度与headerview高度的比例 * * @param offset * 移动距离和headerview高度的比例。范围是0~1,0:headerview全然没显示 * 1:headerview全然显示 * @param offsetY * headerview移动的距离 */ public void onHeaderMove(double offset, int offsetY); }
9.自己定义header和footer
9.1.自己定义header
实现IHeaderCallBack接口。并继承View就能够自己定义headerview了/** * 提供自己定义headerview的接口 * * @author huxq17@163.com * */ public interface IHeaderCallBack { /** * 正常状态 */ public void onStateNormal(); /** * 准备刷新 */ public void onStateReady(); /** * 正在刷新 */ public void onStateRefreshing(); /** * 刷新结束 */ public void onStateEnd(); /** * 获取headerview显示的高度与headerview高度的比例 * * @param offset * 移动距离和headerview高度的比例,范围是0~1,0:headerview全然没显示 1:headerview全然显示 * @param offsetY * headerview移动的距离 */ public void onHeaderMove(double offset, int offsetY); /** * 设置显示上一次刷新的时间 * * @param lastRefreshTime * 上一次刷新的时间 */ public void setRefreshTime(long lastRefreshTime); /** * 隐藏footerview */ public void hide(); /** * 显示footerview */ public void show(); /** * 获得headerview的高度,假设不想headerview所有被隐藏,就能够仅仅返回一部分的高度 * * @return */ public int getHeaderHeight(); }
这里须要介绍下几种headerview的状态
Created with Raphaël 2.1.0normalnormalreadyreadyrefreshingrefreshingfinishfinishheader移动的距离大于header的高度header移动的距离小于header的高度松手进入refreshing状态刷新完毕进入finish状态,此过程header被固定着此时header開始回弹,至全然隐藏时,状态变成normal
XRefreshView提供了不同状态的回调,方便开发人员依据状态来改变headerview的显示,同一时候为了提供更加强大的支持。XRefreshView提供了onHeaderMove(double offset, int offsetY)回调来返回当前headerview移动的信息。这样能够更加自由的定制headerview。在继承了View并实现了IHeaderCallBack接口以后,须要调用以下这种方法来设置自己定义headerview
refreshView.setCustomHeaderView(new CustomHeader(this));
9.2.自己定义footer
自己定义footer和自己定义header相似,都相同要实现接口,自己定义footer要实现 IFooterCallBack接口public interface IFooterCallBack { /** * 当不是到达底部自己主动载入很多其它的时候,须要自己写点击事件 * @param xRefreshViewListener */ public void callWhenNotAutoLoadMore(XRefreshViewListener xRefreshViewListener); /** * 正常状态,比如须要点击footerview才干载入很多其它。主要是到达底部不自己主动载入很多其它时会被调用 */ public void onStateReady(); /** * 正在刷新 */ public void onStateRefreshing(); /** * 刷新结束 */ public void onStateFinish(); /** * 已无很多其它数据 */ public void onStateComplete(); /** * 隐藏footerview */ public void hide(); /** * 显示footerview */ public void show(); /** * 获得footerview的高度 * @return */ public int getFooterHeight(); }
footerview的状态流程分成两种
1.当到达底部自己主动载入很多其它:
1.1.还有很多其它数据
refreshing–>finish–>refreshing
1.2.已无很多其它数据
refreshing–>finish–>complete
2.当到达底部不自己主动载入很多其它:
2.1.还有很多其它数据
ready–>refreshing–>finish–>refreshing
2.2.已无很多其它数据
ready–>refreshing–>finish–>complete
当中,当不是到达底部自己主动载入很多其它的时候,须要自己写点击事件,就像这样:
@Override public void callWhenNotAutoLoadMore(final XRefreshViewListener listener) { mClickView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(listener!=null){ listener.onLoadMore(); onStateRefreshing(); } } }); }
给footer设置点击事件。在点击事件中直接回调onLoadMore。而且进入刷新状态。
还有就是footer的show和hide方法不能向header那样:
header /** * hide footer when disable pull load more */ public void hide() { setVisibility(View.GONE); } public void show() { setVisibility(View.VISIBLE); }
直接gone会给列表底部留下空白。所以应该这样
public void hide() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView .getLayoutParams(); lp.height = 0; mContentView.setLayoutParams(lp); } public void show() { LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView .getLayoutParams(); lp.height = LayoutParams.WRAP_CONTENT; mContentView.setLayoutParams(lp); }
最后也须要通过以下这种方法来设置自己定义footerview
refreshView.setCustomFooterView(new CustomFooterView(this));
10.Recylerview的Adapter
Recylerview的adapter必须继承自UltimateViewAdapter。具体使用方法能够參照demo中的SimpleAdapter,此外,给Recylerview设置自己定义footerview和设置自己定义headerview是不一样的。设置自己定义headerview是通过XRefreshView来设置的,可是设置自己定义footerview确是通过UltimateViewAdapter来设置的。具体例如以下:UltimateViewAdapter /** * Using a custom LoadMoreView * * @param customview * the inflated view */ public void setCustomLoadMoreView(View footerView) { if (footerView instanceof IFooterCallBack) { customLoadMoreView = footerView; } else { throw new RuntimeException( "footerView must be implementes IFooterCallBack!"); } } ...... adapter.setCustomLoadMoreView(footerView);
注:眼下上拉载入很多其它仅仅支持Linearlayoutmanager。我还在找解决的方法。
最后
XRefreshView托管于github。点此前往下载,欢迎start or fork。參考的项目
在开发过程中有參考一些非常不错的开源项目。各自是UltimateRecyclerView
android-Ultra-Pull-To-Refresh
相关文章推荐
- Android Studio 的使用——GsonFormat插件的安装
- Android Framework 记录之一
- Android客户端性能优化
- Android 自定义Camera(二)
- Android Screen Monitor抓取真机屏幕
- [android] 隐式意图的配置
- 在Android Studio中有六种依赖
- android官方侧滑菜单DrawerLayout详解
- Android 签名机制:Key的产生方法和签名原理
- Android利用云盘实现手机上传功能
- Android中设计模式--状态模式(将动作委托到当前状态,状态之间可以互相转换)
- Android之下拉刷新的ListView
- Android的材料设计兼容库(Design Support Library)
- 《50 Android Hacks》学习心得一:延迟加载和布局重用
- Android——布局(线性布局linearLayout,表格布局TableLayout,帧布局FrameLayout)
- android:layout_gravity和android:gravity的区别
- 解决Android中的SQLite数据库并发访问
- Android TabLayout、ViewPager实现顶部和底部Tab导航 点击滑动切换Tab页面
- Android之ListView使用总结
- 理解Android系统的四大组件