scwang90 / SmartRefreshLayout

🔥下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有极强的扩展性,集成了几十种炫酷的Header和 Footer。
https://segmentfault.com/a/1190000010066071
Apache License 2.0
24.8k stars 4.94k forks source link

动态设置不同刷新头部时,MaterialHeader刷新头部的SpinnerStyle会覆盖后续设置刷新头部的SpinnerStyle #1075

Open JunhuaLin opened 4 years ago

JunhuaLin commented 4 years ago

详细描述 动态设置不同刷新头部时, 1.先设置MaterialHeader刷新头部后,执行下拉刷新,此时下拉效果为SpinnerStyle.FixedFront。 2.代码中设置为其他的刷新头部(如:ClassicsHeader,下拉效果为SpinnerStyle.Translate),执行下拉刷新,此时下拉效果仍然为SpinnerStyle.FixedFront。 3.那么后续所有新设置的头部的下拉刷新效果均为SpinnerStyle.FixedFront

期望:下拉效果为当前设置的刷新头部的SpinnerStyle效果

使用版本

implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' 
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0' 

使用代码

使用github代码示例RefreshStylesFragment的刷新代码发现的!分支为release 1.1.0版本的代码。

RefreshStylesFragment中的代码仅仅改变了设置的刷新头部添加了MaterialHeader。


        RefreshLayout refreshLayout = root.findViewById(R.id.refreshLayout);
        if (refreshLayout != null) {
            refreshLayout.setOnMultiPurposeListener(new SimpleMultiPurposeListener() {
                @Override
                public void onRefresh(@NonNull final RefreshLayout refreshLayout) {
                    refreshLayout.finishRefresh(3000);
                }
                @Override
                public void onLoadMore(@NonNull final RefreshLayout refreshLayout) {
                    refreshLayout.finishLoadMore(2000);
                }
                @Override
                public void onStateChanged(@NonNull RefreshLayout refreshLayout, @NonNull RefreshState oldState, @NonNull RefreshState newState) {
                    if (newState == RefreshState.None) {
                        if (oldState == RefreshState.LoadFinish) {
                            RefreshFooter refreshFooter = refreshLayout.getRefreshFooter();
                            if (refreshFooter instanceof RefreshFooterWrapper) {
                                View footerView = refreshFooter.getView();
                                if (footerView instanceof TaurusHeader) {
                                    refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new DropBoxHeader(getContext())));
                                } else if (footerView instanceof DropBoxHeader) {
                                    refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new DeliveryHeader(getContext())));
                                } else if (footerView instanceof DeliveryHeader) {
                                    refreshLayout.setRefreshFooter(new RefreshFooterWrapper(new BezierCircleHeader(getContext())));
                                } else {
                                    refreshLayout.setRefreshFooter(new BallPulseFooter(getContext()));
                                }
                            }
                        } else if (oldState == RefreshState.RefreshFinish) {
                            RefreshHeader refreshHeader = refreshLayout.getRefreshHeader();
                            if (refreshHeader instanceof RefreshHeaderWrapper) {
//此处注释掉多余刷新头部
                            /*    refreshLayout.setRefreshHeader(new PhoenixHeader(getContext()));
                            } else if (refreshHeader instanceof PhoenixHeader) {
                                refreshLayout.setRefreshHeader(new DropBoxHeader(getContext()));
                            } else if (refreshHeader instanceof DropBoxHeader) {
                                refreshLayout.setRefreshHeader(new FunGameHitBlockHeader(getContext()));
                            } else if (refreshHeader instanceof FunGameHitBlockHeader) {*/
                                refreshLayout.setRefreshHeader(new ClassicsHeader(getContext()));
                            } else {
                                refreshLayout.setRefreshHeader(new RefreshHeaderWrapper(new MaterialHeader(getContext())));
                            }
                        }
                    }
                }
            });
        }

问题重现 问题重现操作不走:

  1. 进入style tab页 2.修改为上述代码:添加MaterialHeader刷新头部 3.下拉刷新3次后可发现问题: 4.发现问题:新设置的刷新头部SpinnerStyle.Translate下拉执行效果被改变成MaterialHeader的SpinnerStyle.FixedFront效果

预期行为 按照新设置的刷新效果的SpinnerStyle样式效果执行

设备信息 请填写一下你运行设备的信息,信息越全越有助于我理解问题

JunhuaLin commented 4 years ago

MaterialHeader中 kernel.requestDefaultTranslationContentFor(this, false) 这句代码影响了 后续设置header的动画效果

JunhuaLin commented 4 years ago

此处无论使用MaterialHeader中 kernel.requestDefaultTranslationContentFor(this, false) 修改了默认值

还是使用了kernel.getRefreshLayout().setEnableHeaderTranslationContent(boolean)都会影响后续其他header

所以在自定义刷Header或者Footer时都要明确指明是否需要使内容布局移动,避免被其他Header或者Footer的设置影响展示效果!!!

scwang90 commented 4 years ago

在切换 Header 的时候,如果之前因任何原因被修改了,都要手动修改回来,参考 demo