实现一个用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既能显示上一页的一部分和下一页的一部分又能不断进行循环滑动。