2015-05-11 51 views
0

我見過幾篇關於滾動和標題大小調整的文章,並且看到了@MathieuMaree在這個post中的回答,它讓我首先了解如何在滾動ListView時調整標題大小。滾動時更改標題大小

因此,這裏是我的實現:

我有一個包含3個標籤與ExpandableListView一個ViewPager一個FragmentActivity。

這裏是活動的佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 

    <bla.bla.bla.views.HeaderFicheEquipe 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" > 
    </bla.bla.bla.views.HeaderFicheEquipe> 

    <RelativeLayout 
     android:id="@+id/tabView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/Header" > 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewPager" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" > 

      <android.support.v4.view.PagerTabStrip 
       android:id="@+id/titleStrip" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="@style/PagerTabStripText" /> 
     </android.support.v4.view.ViewPager> 
    </RelativeLayout> 

</RelativeLayout> 

:首先,我設置了OnScrollListener我ExpandableListView:

list.setOnScrollListener((CardActivity) getActivity()); 

然後,我實現了OnScrollListener我FragmentActivity:

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
    int totalSize = 0; 
    View v = view.getChildAt(0); 

    if (v != null) { 
     if (elementSizes.size() > 0 && firstVisibleItem <= elementSizes.size()) { 
      for (int i = 0; i < firstVisibleItem; ++i) { 
       totalSize += elementSizes.get(i); 
      } 
      totalSize -= (v.getTop() - view.getPaddingTop()); 
      if (totalSize > (maxHeightHeader - minHeightHeader)) 
       totalSize = maxHeightHeader - minHeightHeader; 
     } else { 
      totalSize = maxHeightHeader - minHeightHeader; 
     } 
     header.getLayoutParams().height = maxHeightHeader - totalSize; 
     header.requestLayout(); 
    } 
} 

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
} 

elementsSize是一個列表,裏面填充了我的第一個元素的大小ST。頭部實際上正在減少,但我的onScroll被調用的方式太多了:當頭部縮小時,我的列表上升,如果用戶將手指放在屏幕上,它會再次使用Scroll上的Android調用,但是信息不正確。我的標題在很短的時間內(從我想要的尺寸跳到最大高度,從最大高度跳到想要的尺寸)發生了很多次變化,直到我達到最小尺寸,再次運行得很好。

我不知道我現在的執行是否正確,如果只是這種情況導致它無法正常工作或者我失去了一些東西。我看到一些應用程序在滾動時正在調整標題大小,但它們看起來工作方式不同:它們縮小標題,並且只有在標題以最小尺寸開始滾動到列表中時才起作用。

如何在頁眉不是最小尺寸時「阻止」列表的滾動?或者我的代碼有問題可以解決?

在此先感謝您的幫助

托馬斯

+0

主要問題是由ViewPager造成的。我嘗試將'header.getLayoutParams()。height'更改爲'header.translationY(translation)',但ViewPager停留在相同的位置,如果我移動包含ViewPager的Layout來跟隨翻譯,大小不會'沒有改變,也沒有完全填滿屏幕。 –

+0

您是否設法使其工作? –

+0

可悲的是,沒有。但是我現在正在開發一個新的應用程序,因此我必須找到解決方案,這是必需的。 –

回答

0

我有同樣的問題,我花了一段時間才能找到解決的辦法。

我還得到了您在緩慢滾動屏幕或將手指放在屏幕上時提到的「不正確的值」。這導致我的標題圖像大小上下浮動。

訣竅是在你的列表視圖上註冊一個onTouchListener,觀察移動事件,以確定你是否實際向上或向下滾動。 在您的onScroll偵聽器上,如果scrollposition方向與onTouch偵聽器的Move Event的方向匹配,您可以調整標題大小。

private float mCurrentYPositionOnScreen; 
private float mSavedYPositionOnScreen; 
private int mLastScrollYPosition; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
{ 

    listView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_MOVE: 
        mCurrentYPositionOnScreen = event.getRawY(); 

        break; 

       case MotionEvent.ACTION_UP: 
        mCurrentYPositionOnScreen = 0; 

        break; 
      } 

      return false; 
     } 

    }); 



    listView.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

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

      View c = listView.getChildAt(0); 

      if(c == null) 
       return; 

      if(mSavedYPositionOnScreen == mCurrentYPositionOnScreen && mCurrentYPositionOnScreen != 0) 
       return; 

      boolean needToScrollDown = mCurrentYPositionOnScreen < mSavedYPositionOnScreen; 

      int currentScrollYPosition = -c.getTop(); 
      listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight()); 
      for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) { 
       if (listViewItemHeights.get(i) != null) 
        currentScrollYPosition += listViewItemHeights.get(i); 
      } 

      boolean scrollingDown = currentScrollYPosition > mLastScrollYPosition; 

      if(needToScrollDown && !scrollingDown && mLastScrollYPosition != 0 && mCurrentYPositionOnScreen != 0) 
       return; 

      if(!needToScrollDown && scrollingDown && mLastScrollYPosition != 0 && mCurrentYPositionOnScreen != 0) 
       return; 

      mLastScrollYPosition = currentScrollYPosition; 

      final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(mOriginalBannerImageViewWidth, mOriginalBannerImageViewHeight); 

      int height = mOriginalBannerImageViewHeight - currentScrollYPosition; 

      if(height < 0) 
       height = 0; 

      final int finalHeight = height; 

      mBannerImageView.setLayoutParams(layoutParams); 
      mBannerImageView.getLayoutParams().height = finalHeight; 
      mBannerImageView.requestLayout(); 

      mSavedYPositionOnScreen = mCurrentYPositionOnScreen; 


     } 
    }); 

    return view; 
}