appbarlayout+springview+viewpager滑动冲突的问题


简介:在做一个关于CoordinatorLayout+appbarlayout实现滑动隐藏Toolbar的demo的时候,里面加了viewpager+fragment,刷新控件用的springview,滑动用的recyclerview发现左右滑动的时候,toolbar已经隐藏了起来,但是下拉直接触动了springview,但是上拉一下再下拉又没有了这种冲突,为了解决这种冲突,我用了appbarlayout的监听滑动的方法,贴上步骤:


  • 首先我的springview是在Fragment里的,但是Appbarlayout又是在Activity里的,我就用了全局获取的方法:

编写Myapplication:

    private AppBarLayout appBarLayout;

    public void setAppBarLayout(AppBarLayout appBarLayout) {
        this.appBarLayout = appBarLayout;
    }

    public AppBarLayout getAppBarLayout() {
        return appBarLayout;
    }

接下来只要在activity里面放入activity的实例就好了

Myapplication myapplication=(Myapplication)getApplication();
myapplication.setAppBarLayout(appBarLayout);


这样就可以在fragment里面获取到appbarlayout的实例了,fragment有一个setUserVisibleHint的方法,当Fragment显示或者隐藏时,就会调用该方法,那么我们就在这个方法里面处理这个冲突:

if(isVisibleToUser&&this.getContext()!=null)
{
Myapplication application=(Myapplication)this.getContext().getApplicationContext();
if(application.getAppBarLayout()!=null)
{
application.getAppBarLayout().addOnOffsetChangedListener(this);
}
}
else if(isVisibleToUser&&this.getContext()==null)
{
mthread=new MyThread();
mthread.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
try {
Thread.sleep(100);
Log.d("spring", "run: "+Fatherfragemnt.this.getContext());
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Fatherfragemnt.this.getContext()!=null)
{
Myapplication application=(Myapplication)Fatherfragemnt.this.getContext().getApplicationContext();
if(application.getAppBarLayout()!=null)
{
application.getAppBarLayout().addOnOffsetChangedListener(Fatherfragemnt.this);
}
}
}
}


解释:首先我们判断,当Fragment可见并且getcontext不为空的时候,我们就可以获取到appnarlayout,并设置监听器,为了防止getcontext还来不及获取到,这里新开了一个线程,获取到就设置监听器,然后重写onOffsetChanged()方法:


if(help==1)
{
if(verticalOffset<0)
{
springView.setEnable(false);
Log.d("spring", "onOffsetChanged: "+help);
}
help=2;
}
if(verticalOffset==0)
{
if(!springView.isEnable())
{
springView.setEnable(true);
}
}


这里定义了一个help,目的是当fragment第一次显示的时候并且设置了监听器的时候就会判断如果toolbar处于隐藏的状态,就设置springview不可见,就不会下拉刷新了,当toolbar显示完全的时候,就设置springview可见,这样就可以下拉刷新了,但是这样有一个问题,如何上拉加载呢? 我想的是判断recycleview滑动状态来设置:


@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if(dy>0)
{
if(!springView.isEnable())
{
springView.setEnable(true);
}
}
}


当recycleview向下滑动时就会调用onscrolled的方法,设置springview可见,这样我们的目的就达到了。


总结一下我们的思路就是当fragment加载的时候判断toolbar有没有隐藏和第一次打开(如果不设置,当再返回这个fragment的时候,在这个fragment里面加载更多就会把springview设置为不可见,引发更多的问题),如果隐藏了我们就设置springview不可见,这样就不会冲突了,然后当用户直接加载更多的时候就利用recycleview的onscrolled的方法设置springview可见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值