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

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: