AppBarLayout.OnOffsetChangedListener 解决下拉刷新先于AppbarLayout的问题
2016-06-30 11:10
609 查看
Material Deisign 炫酷的toolbar效果实在是灰常美丽,楼主使用了一个常规的上推隐藏,下拉显示的效果,
但是遇到下拉刷新控件时会有一些小冲突,我们先看看官网对于AppBarLayout.OnOffsetChangedListener的解释:
Interface definition for a callback to be invoked when an AppBarLayout's
vertical offset changes.
当AppBarLayout垂直方向上的偏移量发生改变时,为触发一个回调方法定义的接口。
触发的回调方法是:onOffsetChanged(AppBarLayout appBarLayout,
int verticalOffset)
再来看看对于onOffsetChanged的解释:
Called when the AppBarLayout's
layout offset has been changed. This allows child views to implement custom behavior based on the offset (for instance pinning a view at a certain y value).
在AppBarLayout的布局偏移量发生改变时被调用。这个方法允许子view根据偏移量实现自定义的行为(比如在特定Y值的时候固定住一个View)。
解释的非常清楚了,不过我们需要点例子才好理解。
就以stackoverflow上的一个问题为例吧。
http://stackoverflow.com/questions/30779667/android-collapsingtoolbarlayout-and-swiperefreshlayout/30785823#30785823
解决方案:
1.拥有Appbarlayout的Actvity实现接口
public class MainActivity extends AppCompatActivity implements AppBarLayout.OnOffsetChangedListener 2.如果verticalOffset==0则可以刷新 否则不可以
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (operatelogFragment == null)
return;
if (verticalOffset == 0) {
operatelogFragment.setCanRefresh(true);
} else {
operatelogFragment.setCanRefresh(false);
}
}楼主使用的是PtrFrameLayout
//[下拉刷新] https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 日志模块
献上关键点代码:
final PtrFrameLayout ptrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.fragment_ptr_home_ptr_frame);
StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, ScreenUtils.dip2px(mContext, 20), 0, ScreenUtils.dip2px(mContext, 20));
header.initWithString("LOADING");
header.setBackgroundColor(ContextCompat.getColor(mContext, R.color.ultrarefreshbg));
ptrFrameLayout.setDurationToCloseHeader(1500);
ptrFrameLayout.setHeaderView(header);
ptrFrameLayout.addPtrUIHandler(header);
ptrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
//判断appbarlayout的监听verticalOffSet==0时才可以刷新
return canRefresh&&PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
SearchLog();
ptrFrameLayout.refreshComplete();
}
}, 1500);
}
});
如果是Google的SwipeRefreshLayout:则调用SwipeRefreshLayout.setEnabled(true);
但是遇到下拉刷新控件时会有一些小冲突,我们先看看官网对于AppBarLayout.OnOffsetChangedListener的解释:
Interface definition for a callback to be invoked when an AppBarLayout's
vertical offset changes.
当AppBarLayout垂直方向上的偏移量发生改变时,为触发一个回调方法定义的接口。
触发的回调方法是:onOffsetChanged(AppBarLayout appBarLayout,
int verticalOffset)
再来看看对于onOffsetChanged的解释:
Called when the AppBarLayout's
layout offset has been changed. This allows child views to implement custom behavior based on the offset (for instance pinning a view at a certain y value).
在AppBarLayout的布局偏移量发生改变时被调用。这个方法允许子view根据偏移量实现自定义的行为(比如在特定Y值的时候固定住一个View)。
解释的非常清楚了,不过我们需要点例子才好理解。
就以stackoverflow上的一个问题为例吧。
http://stackoverflow.com/questions/30779667/android-collapsingtoolbarlayout-and-swiperefreshlayout/30785823#30785823
解决方案:
1.拥有Appbarlayout的Actvity实现接口
public class MainActivity extends AppCompatActivity implements AppBarLayout.OnOffsetChangedListener 2.如果verticalOffset==0则可以刷新 否则不可以
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (operatelogFragment == null)
return;
if (verticalOffset == 0) {
operatelogFragment.setCanRefresh(true);
} else {
operatelogFragment.setCanRefresh(false);
}
}楼主使用的是PtrFrameLayout
//[下拉刷新] https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 日志模块
献上关键点代码:
final PtrFrameLayout ptrFrameLayout = (PtrFrameLayout) view.findViewById(R.id.fragment_ptr_home_ptr_frame);
StoreHouseHeader header = new StoreHouseHeader(getContext());
header.setPadding(0, ScreenUtils.dip2px(mContext, 20), 0, ScreenUtils.dip2px(mContext, 20));
header.initWithString("LOADING");
header.setBackgroundColor(ContextCompat.getColor(mContext, R.color.ultrarefreshbg));
ptrFrameLayout.setDurationToCloseHeader(1500);
ptrFrameLayout.setHeaderView(header);
ptrFrameLayout.addPtrUIHandler(header);
ptrFrameLayout.setPtrHandler(new PtrHandler() {
@Override
public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
//判断appbarlayout的监听verticalOffSet==0时才可以刷新
return canRefresh&&PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
ptrFrameLayout.postDelayed(new Runnable() {
@Override
public void run() {
SearchLog();
ptrFrameLayout.refreshComplete();
}
}, 1500);
}
});
如果是Google的SwipeRefreshLayout:则调用SwipeRefreshLayout.setEnabled(true);
相关文章推荐
- android源码解析之(二)-->异步消息机制
- Android实现点击AlertDialog上按钮时不关闭对话框
- Android_基于BMOB的聊天软件_添加好友
- 播放音乐,声音
- swift-隐藏键盘
- 安卓Serivice服务被系统杀掉的问题
- unity 5.3.1播放视频文件
- Android触摸事件与点击事件的区别
- android应用的数据应该保存到哪儿
- Android的Fragment
- 二 APPIUM Android自动化 环境搭建
- android 异步方式实现数据加载
- android事件分发机制
- iOS开发-显示发送时间(几分钟前,几小时前,几天前)
- 深入runtime探究KVO
- 微信web调试工具
- 一 APPIUM基本理论知识
- 切换多国语言导致Fragment被回收,出现切换错乱
- Yalantis 那些动画效果很炫的 Android 及 iOS 开源项目
- Android高手进阶:Adapter深入理解与优化