使用listview滚动动态更改viewpager和viewpager项目大小

时间:2015-11-06 09:06:42

标签: android listview android-viewpager

我的listview低于viewpager并处于初始状态(当没有滚动任何内容时),viewpager只显示一个带有10dp"预览的项目&# 34;下一个和之前的项目(我通过设置负页边距来实现此目的:viewPager.setPageMargin(-48);)。我想要做的是向下滚动listview

1)listview应该"推" viewpager向上,将其高度降低到某一点。在达到该点时(viewpager的某些minHeight),listview应正常滚动,其上方的小viewpager

2)viewpager中的下一个和前一个项目应该向内(朝向中心项目),在最终状态中,viewpager三个项应该充分展示。 (下面的图片说明了这一点)

向上滚动列表视图应该相反。

我已成功完成任务的第(1)部分。这是代码

我的viewpagerlistview位于FrameLayout内,如下所示:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/activity_main" tools:context=".MainActivity">

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:dividerHeight="1dp"
    android:divider="#000000"
    android:scrollbars="none" />


<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:background="#FFFFFF"/>

</FrameLayout>

我&#34;假&#34;通过向listview添加viewpager标题视图并将transaprent和{{1}的高度都添加到listview以下headeview同样的。这是代码的片段:

viewpager

fake_list_header布局文件:

screenWidth = // Screen width of the phone
headerHeight = // Required height of the viewpager and the headerview

headerView = inflater.inflate(R.layout.fake_list_header, listView, false);
headerView.getLayoutParams().height = headerHeight;
headerView.getLayoutParams().width = screenWidth;
viewPager.getLayoutParams().height = headerHeight;
viewPager.getLayoutParams().width = screenWidth;
viewPager.setPageMargin(negativeMargin);
listView.addHeaderView(headerView, null, false);

// Other initializations and stuff

最后,我的<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> listview 负责根据OnScrollListener滚动的金额调整viewpager高度并停止我们达到listview的最低高度:

viewpager

我的任务的第(2)部分是我被困住的地方(并且没有想法),我尝试使用滚动条更改 OnScrollListener() { @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { if (listview.getFirstVisiblePosition() == 0) { View firstChild = listview.getChildAt(1); // 0th element is the fake headerview itself int topY = 0; if (firstChild != null) { topY = firstChild.getTop(); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.width = screenWidth; layoutParams.height = topY; if (topY < headerHeight && topY >= minHeight) { // minHeight is the minimum height the viewpager takes, after this point it stops getting smaller //And vice-versa with headerHeight taking care of the maximum height the viewpager can take viewpager.setLayoutParams(layoutParams); } } } } } 的{​​{1}},但结果并非如此好(也不认为这是实现这样的事情的正确方法)。通过使用滚动调用pageMargin来设置寻呼机中下一个(或上一个)视图的X位置也不起作用。

以下是我想要实现的一些模拟:

初始状态(没有滚动)

enter image description here

最终状态(达到了viewpager的minHeight)

enter image description here

正在使用viewpagersetTranslationX正确的方法来实现这样的目标吗?我想过使用水平viewpager而不是listview,但我需要&#34;页面和#34;用于水平滚动/滑动项目的recyclerview的滚动行为。欢迎任何建议

1 个答案:

答案 0 :(得分:0)

在主布局中尝试此操作

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/activity_main" tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="1dp"
        android:layout_below="@+id/pager"
        android:divider="#000000"
        android:scrollbars="none" />


    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:clipToPadding="false"
        android:background="#FFFFFF"/>

</RelativeLayout>