我在下面viewpager
并在初始状态(当什么也没有滚动)一个listview
,该viewpager
显示下一个和以前的10dp“预览”只有一个项目项目(我已通过设置负页边距达到此目的:viewPager.setPageMargin(-48);
)。我正在试图做的是,在向下滚动listview
:变化viewpager和viewpager项目与列表视图滚动动态尺寸
1)listview
应该“推”viewpager
,将其高度降低到某个点。在达到这一点时(一些minHeight的viewpager),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>
我“假”的listview
是viewpager
下方加入了transaprent
头欣赏到listview
和制造的高度headeview
和viewpager
相同。这里的代码片段:
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
fake_list_header布局文件:
<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
的最小高度时:
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);
}
}
}
}
}
我的任务的第(2)部分是我被卡住的地方(并且用完了想法),我试图用改变pageMargin
,但结果不好(也不认为这是正确的方法来实现这样的事情)。通过滚动调用setTranslationX
来设置寻呼机中下一个(或前一个)视图的X位置也不起作用。
这里是什么,我想实现一些嘲笑:
初始状态(没有滚动)
最终状态(实现viewpager的了minHeight)
正在使用viewpager
和listview
达到这样的目标吗?我想使用水平recyclerview
而不是viewpager
,但我需要“逐页”滚动行为的viewpager
水平滚动/滑动的项目。任何建议表示欢迎
你能解释一下这是如何工作的?你似乎正在设置一个高度viewpager –
我也采取RelativeLayout代表框架布局,并在列表视图中使用属性android:layout_below =“@ + id/pager”。 –
但这并不能解决我试图解决的问题 –