2013-06-19 79 views
1

我有一個活動,其佈局由一個包含主頁面的主佈局(我們稱之爲「主視圖」)的ScrollView組成。我使用ScrollView的原因是,在一些較小的屏幕上,內容可能佔用比屏幕本身更多的垂直空間。我想在ScrollView上添加一個視圖,並將其從屏幕上拖出(我們稱之爲「隱藏視圖」),並且只有在用戶已經位於滾動型。下面是什麼我描述的例子:隱藏視圖僅當用戶拉下時才顯示屏幕

Before Scrolling Down

After Scrolling Down

此外,爲了使問題更加複雜,如果滾動型被滾動到頂部,我想它之前停止「隱藏的看法」進入視野。我只想當用戶在ScrollView已經滾動到頂部(類似於pulltorefresh)後拉下時顯示「隱藏視圖」。

我還希望用戶能夠回滾到「重新隱藏」隱藏視圖。

我不確定實現此目的的最佳方法。我已經玩過拉圖書館的庫,但它似乎太強大,我試圖完成。另外,這不完全是我追求的效果。例如,我可以在下拉菜單後顯示「正在加載...」屏幕,但在此之後,我希望我的「隱藏視圖」保留在屏幕上,直到用戶將其重新推回。如果我可以使用pulltorefresh來完成這項工作,那會很棒,但是我會迷失在試圖追蹤圖書館的代碼。

我也考慮簡單地向ScrollView添加隱藏視圖,並使用scrollView.fullScroll(ScrollView.FOCUS_DOWN)強制ScrollView滾動到底部。問題在於,如果設備的屏幕不是很小,則可以同時顯示「主視圖」和「隱藏視圖」,並且不需要滾動。另外,在「隱藏視圖」出現在屏幕之前,我無法得到ScrollView停止之後的效果。

我考慮的另一個選擇是做我上面描述的,然後調整「主視圖」以匹配設備的屏幕大小,然後強制ScrollView到底。但是,再次,我會失去ScrollView停止的效果。

我覺得必須有一個更容易或更優雅的方式來做到這一點,我錯過了。謝謝!

+0

你知道嗎? –

回答

0

我相信像this是你在找什麼?它類似於滾動向下時如何顯示Google搜索框

+0

排序,但我只希望框出現在屏幕的頂部,而不是任何時候列表向下滾動。 – JoeKacz

1

我這樣做的方式是通過在用戶滾動到頁面頂部時偵聽,然後嘗試再次向上滾動頁面。我不得不在ListView,onScrollListener和onTouchListener上的兩個偵聽器之間進行基本的通信。當用戶嘗試向上滾動時,會出現一個搜索框。一旦它們向下滾動就會消失。

下面是代碼:

lstView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_UP: 
       if (listIsAtTop() && expose) 
        searchBox.setVisibility(View.VISIBLE); 
       break; 
      case MotionEvent.ACTION_DOWN: 
       searchBox.setVisibility(View.GONE); 
       break; 
     } 

     return false; 
    } 
}); 
lstView.setOnScrollListener(new AbsListView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && listIsAtTop()) 
      expose = true; 
     else if (!listIsAtTop()) 
      expose = false; 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    } 
}); 

helper方法尋找當列表是在最頂部,無法進一步滾動:

private boolean listIsAtTop() { 
    if (lstView.getChildCount() == 0) 
     return true; 
    return lstView.getChildAt(0).getTop() == 0; 
} 

然後有一些靜態變量揭露最初設置爲true的類。爲我工作。