2015-05-11 49 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; 
}