滚动

时间:2015-05-11 13:50:19

标签: android listview resize

我看过几篇关于滚动和标题大小调整的帖子,并在这个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,但信息不正确。我的标题在很短的时间内(从我想要的大小跳到最大高度,从最大高度跳到想要的大小)很多次都会改变大小,直到我达到了它再次运行良好的最小尺寸。

我不知道我的实施现在是否正确,是否只是因为它不能正常工作或者我错过了什么。我看到一些应用程序在滚动时调整页眉大小,但它们的工作方式不同:它们会减少标题,只有在标题符号最小后才开始滚动到列表中。

当标题未达到最小大小时,如何“阻止”列表的滚动?或者我的代码有问题可以解决吗?

预先感谢您的帮助

托马斯

1 个答案:

答案 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;
}