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

论坛 期权论坛 脚本     
已经匿名di用户   2022-5-29 19:39   1765   0

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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP