实现一个用viewpager显示上一页和下一页一部分,而且能够不断循环的功能,我们只需要下面几步
1、在很多时候我们使用ViewPager的时候,往往都需要viewpager自适应高度,但是会发现wrap_content会不起作用,这时候就需要自定义一个自适应高度的ViewPager。自定义viewpager的核心代码
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if (h > height)
height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/member_bg"
android:id="@+id/ll_container"
android:clipChildren="false">
<WrapContentHeightViewPager
android:id="@+id/vp_member"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:layout_marginLeft="30dp"
android:layout_gravity="center_horizontal"
android:clipChildren="false"/>
</LinearLayout>
3、java文件
private void init() {
mWidth = mScreenWidth - DisplayUtil.dip2px(this, 100);
itemHeight = (mScreenWidth - DisplayUtil.dip2px(this, 60)) / 2;
mHeight = mWidth / 1.78f;
for (View view : itemViews) {
view.getLayoutParams().height = (int) itemHeight;
view.getLayoutParams().width = (int) itemHeight;
}
for (int i = 0; i < memberLevelIcons.length; i++) {
ImageView ivMember = new ImageView(this);
ViewGroup.LayoutParams lp = ivMember.getLayoutParams();
if (lp == null) {
lp = new ViewGroup.LayoutParams((int) mWidth, (int) mHeight);
} else {
lp.width = (int) mWidth;
lp.height = (int) mHeight;
}
ivMember.setLayoutParams(lp);
ivMember.setAdjustViewBounds(true);
ivMember.setImageResource(memberLevelIcons[i]);
if (vipLevel <= 0) {
ivMember.setId(i);
ivMember.setOnClickListener(this);
}
ivMembers.add(ivMember);
}
vpMember.getLayoutParams().height = (int) mHeight;
loopPagerAdapter = new LoopPagerAdapter(ivMembers);
vpMember.setAdapter(loopPagerAdapter);
vpMember.setPageMargin(20);//设置两边显示的距离
vpMember.setCurrentItem(ivMembers.size()*100)//进行不断循环需要设置的
//将父类的touch事件分发至viewPager,否则只能滑动中间的一个view对象ll_container.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {return vpMember.dispatchTouchEvent(event);}});}
4、LoopPagerAdapter 适配器
public class LoopPagerAdapter extends PagerAdapter{
private List<View> showViews;
public LoopPagerAdapter(List<View> showViews) {
this.showViews = showViews;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
@Override
public Object instantiateItem(View container, int position) {
int pos = position % showViews.size();
View view = showViews.get(pos);
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
((ViewPager) container).addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
}
这样就完成了用Viewpager既能显示上一页的一部分和下一页的一部分又能不断进行循环滑动。
更多推荐
Viewpager显示上一页的一部分和下一页的一部分(循环滑动)
发布评论