我的listview
低于viewpager
并处于初始状态(当没有滚动任何内容时),viewpager
只显示一个带有10dp"预览的项目&# 34;下一个和之前的项目(我通过设置负页边距来实现此目的:viewPager.setPageMargin(-48);
)。我想要做的是向下滚动listview
:
1)listview
应该"推" viewpager
向上,将其高度降低到某一点。在达到该点时(viewpager的某些minHeight),listview
应正常滚动,其上方的小viewpager
。
2)viewpager
中的下一个和前一个项目应该向内(朝向中心项目),在最终状态中,viewpager
的三个项应该充分展示。 (下面的图片说明了这一点)
向上滚动列表视图应该相反。
我已成功完成任务的第(1)部分。这是代码
我的viewpager
和listview
位于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位置也不起作用。
以下是我想要实现的一些模拟:
初始状态(没有滚动)
最终状态(达到了viewpager的minHeight)
正在使用viewpager
和setTranslationX
正确的方法来实现这样的目标吗?我想过使用水平viewpager
而不是listview
,但我需要&#34;页面和#34;用于水平滚动/滑动项目的recyclerview
的滚动行为。欢迎任何建议
答案 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>