2014-07-14 112 views
5

我希望存檔可以用圖像保持滾動型滾動位置的動態內容

enter image description here

灰色方塊代表屏幕最好的解釋是什麼,藍色的盒是元信息,白色的圓框SearchView和紅色框是從搜索返回的項目。

到目前爲止,我得到了這個工作,但是當用戶搜索某些內容並且項目超出屏幕(1)時會出現問題。之後用戶向下滾動,因此元信息在屏幕外(2)。用戶現在仍然可以輸入新的搜索查詢,從而更改項目。但是,當新的查詢返回太少的項目來填充屏幕的其餘部分(3)時,ScrollView將「跳回」到頂部(不在圖像中,不需要)。我想要的是一個SearchView保持放置的行爲(3)。一旦處於這種狀態,用戶可以滾回到頂部(4)。如果她這樣做,她不能回滾,反而會出現overscroll指標。

類似的行爲可以在Google+應用程序中看到。從開始屏幕轉到您的個人資料(點擊頂部的姓名)。你會看到三個寄存器(「關於我」,「帖子」,「照片」*)。例如,我有沒有照片,行爲如上所述。

編輯 ScrollView是視圖的根。

編輯基本佈局結構

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:overScrollMode="always" 
    android:fillViewport="true"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <View /> <!-- Meta info --> 
     <SearchView /> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
     <View /> <!-- Item representing search result --> 
    </LinearLayout> 
</ScrollView> 

*)從德國應用假定翻譯。

+0

由於我不熟悉這是如何完成的,因此您可以提供一些片段,其中正在使用哪些類來實現您目前工作的滾動行爲。思考過程並試圖找到一種方法。 –

+1

您是否嘗試過使用scrollTo()將ScrollView向下移動?不知道這是你應該使用,但它可能會有所幫助。 – zgc7009

+0

這只是一個普通的ScrollView而已。沒有什麼花哨。 – Mene

回答

0

由於在android sdk中似乎沒有標準解決方案,也沒有任何公開代碼這樣做,所以我修改了我自己的解決方案。這是我的工作解決方案:

我將搜索結果包裝在LinearLayout中,並使用minimumHeight來歸檔所需的行爲。這樣,當項目添加到列表中時,我不需要擺弄測量。

<LinearLayout 
    android:id="@+id/scroll_placeholder" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    > 
    <View /> <!-- result --> 
    <View /> <!-- result --> 
    <View /> <!-- result --> 
</LinearLayout> 

搜索結果是異步檢索的,所以我清除了列表並在觸發新搜索時啓動搜索指示符。此時我還將最小高度設置爲itemList的可見矩形的大小。請注意,itemList不是ScrollView,否則在ScrollView中會出現ScrollView,這是有問題的。它基本上是一個包含結果的LinearLayout。

int scrollY = rootScrollView.getScrollY(); 
if (scrollY > 0) { 
    final Rect visibleListViewRect = new Rect(); 
    placeholder.getGlobalVisibleRect(visibleListViewRect); 
    placeholder.setMinimumHeight(visibleListViewRect.height()); 
} else { 
    placeholder.setMinimumHeight(0); 
} 

這會給出圖3)中所示的問題。

要禁用背下來,一旦用戶已經向上滾動(圖片4)滾動我添加了一個ScrollChangedListener:

placeholder.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
    @Override 
    public void onScrollChanged() { 
     int scrollY = placeholder.getScrollY(); 
     if (scrollY > 0) { 
      final Rect visibleListViewRect = new Rect(); 
      placeholder.getGlobalVisibleRect(visibleListViewRect); 
      placeholder.setMinimumHeight(visibleListViewRect.height()); 
     } else { 
      placeholder.setMinimumHeight(0); 
     } 
    } 
}); 

就是這樣。

0

因爲您沒有提及過任何代碼。我只能向您推薦可能的解決方案。我遇到過類似的問題。您面臨的問題是由於兒童佈局的重點。最有效的解決方案是控制此問題焦點。

嘗試使用

ScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 

,並使用你的搜索框時,您可以通過編程進行更多的控制做

searchBox.requestFocus() 

你也可以嘗試MotionListener.If也可以加我的代碼可能更具體。 不要忘記檢查滾動視圖方法http://developer.android.com/reference/android/widget/ScrollView.html

僅供參考,重點打會給你很多有趣的場景和動畫/動作太:)

+0

我添加了我的佈局大綱。但說實話,我不明白這與焦點有什麼關係。 – Mene

+1

好的..如果您在linearlayout(列表視圖)下方添加了另一個佈局,請填寫滾動視圖佈局的其餘部分。 – Droidekas

+0

是的,那是我現在正在實施的解決方案。也是我腦海中解決它的第一種方法,但如果記住圖像,它實際上很複雜。我希望有更直接的事情,尤其是在Google+上完成之後。 – Mene

0

也許我將有時間回來稍後並更新更多的細節,我認爲我會解決這個問題。但至於現在我只會發布一些我有時間的東西。

我相信這將在下面的scrollview和只是一個視圖上面完成。一個是元數據和searchview,另一個是要在模擬列表中滾動的元素。

當您在下面的模擬列表上滾動時,必須執行檢查。根據滾動視圖上的偵聽器,通過下面的滾動視圖中的操作減少上述視圖的大小;到searchview的大小的限制。然後,當條件滿足下面的滾動視圖到達結尾時,放大上部視圖以填充空間。