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可见。

猜你喜欢

转载自blog.csdn.net/snailpeople/article/details/72632940
今日推荐