1. 程式人生 > >appbarlayout+springview+viewpager滑動衝突的問題

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