Viewpager显示上一页的一部分和下一页的一部分(循环滑动)

实现一个用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);  
    }  


2、布局文件

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 ViewPager 中显示一页和下一页,你可以使用一个自定义的布局来实现。这个布局可以包含两个按钮,一个用于显示一页,另一个用于显示一页。在每个按钮的点击事件中,你可以调用 ViewPager 的 setCurrentItem() 方法来设置当前显示的页码。 下面是一个简单的实现示例: 1. 创建一个自定义的布局文件 pager_navigation.xml,添加上一页和下一页按钮: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center"> <Button android:id="@+id/btn_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上一页" /> <Button android:id="@+id/btn_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一页" /> </LinearLayout> ``` 2. 在 Activity 中加载布局文件,并找到上一页和下一页按钮: ```java View pagerNavigation = getLayoutInflater().inflate(R.layout.pager_navigation, null); Button btnPrevious = pagerNavigation.findViewById(R.id.btn_previous); Button btnNext = pagerNavigation.findViewById(R.id.btn_next); ``` 3. 设置按钮的点击事件,通过 ViewPager 的 setCurrentItem() 方法切换页面: ```java btnPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPage = viewPager.getCurrentItem(); if (currentPage > 0) { viewPager.setCurrentItem(currentPage - 1); } } }); btnNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int currentPage = viewPager.getCurrentItem(); if (currentPage < adapter.getCount() - 1) { viewPager.setCurrentItem(currentPage + 1); } } }); ``` 其中,adapter.getCount() 方法返回 ViewPager 中页面的总数。注意,在设置当前页码时,要判断当前页码是否已经到达边界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值