AppBarLayout.OnOffsetChangedListener 解决下拉刷新先于AppbarLayout的问题

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); 大笑




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值