我看过几篇关于滚动和标题大小调整的帖子,并在这个post中看到了@ MathieuMaree的答案,这让我初步了解了如何在我的ListView上滚动时调整标题大小。
所以这是我的实施:
我有一个带有ViewPager的FragmentActivity,其中包含3个带有ExpandableListView的标签。
以下是活动的布局:
<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>
首先,我在ExpandableListView上设置了OnScrollListener:
list.setOnScrollListener((CardActivity) getActivity());
然后,我在FragmentActivity上实现了OnScrollListener:
@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是一个列表,其中填充了列表中第一个元素的大小。标题实际上正在减少,但我的onScroll被称为太多了:当标题减少时,我的列表会上升,如果用户将手指放在屏幕上,则会再次调用onScroll,但信息不正确。我的标题在很短的时间内(从我想要的大小跳到最大高度,从最大高度跳到想要的大小)很多次都会改变大小,直到我达到了它再次运行良好的最小尺寸。
我不知道我的实施现在是否正确,是否只是因为它不能正常工作或者我错过了什么。我看到一些应用程序在滚动时调整页眉大小,但它们的工作方式不同:它们会减少标题,只有在标题符号最小后才开始滚动到列表中。
当标题未达到最小大小时,如何“阻止”列表的滚动?或者我的代码有问题可以解决吗?
预先感谢您的帮助
托马斯
答案 0 :(得分:0)
我遇到了同样的问题,我花了一些时间才找到解决方案。
当你慢慢滚动或者将手指放在屏幕上时,我也得到了你提到的“不正确的值”。这导致我的标题图像上下变大,它闪烁。
诀窍是在列表视图上注册onTouchListener,观察移动事件以了解您实际上是向上还是向下滚动。 在onScroll侦听器上,如果滚动方向与onTouch侦听器的Move事件的方向匹配,则可以调整标题的大小。
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;
}