ViewPager案例

MainActivity:

public class MainActivity extends Activity implements OnPageChangeListener {

 private ViewPager mVp;
 private TextView tvTitle;
 private String[] titles;
 private LinearLayout llPoints;
 private int prePosition = 0;
 // 是否是自动切换的开关
 private boolean isLoop = true;

 private Handler mHanlder = new Handler() {
  // 处理消息
  public void handleMessage(android.os.Message msg) {
   switch (msg.what) {
   case 1:
    // 获取当前正在展示的视图的position
    int position = mVp.getCurrentItem();
    // 切换到下一个视图
    mVp.setCurrentItem(position + 1);//当position等于4的时候再加1不就越界?
    break;

   }
  };
 };
 private List<ImageView> list;

 @SuppressWarnings("deprecation")
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  initView();

  titles = getTitles();

  int[] imageRes = getImageRes();

  List<ImageView> list = initData(imageRes);

  tvTitle.setText(titles[0]);
  // 获取0位置的View的背景图片
  llPoints.getChildAt(0).setBackgroundResource(R.drawable.dot_enable);

  MyAdapter adapter = new MyAdapter(list);

  mVp.setAdapter(adapter);

  mVp.setOnPageChangeListener(this);

  // handler机制(原理):Handler;Message;MessageQueue;Looper.
  // 自动切换:不停的发消息
  new Thread() {
   public void run() {
    while (isLoop) {

     try {
      Thread.sleep(3000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }

     mHanlder.sendEmptyMessage(1);
    }
   };
  }.start();
 }

 // 初始化数据
 private List<ImageView> initData(int[] imageRes) {
  list = new ArrayList<ImageView>();
  for (int i = 0; i < imageRes.length; i++) {

   // 创建数据源
   ImageView iv = new ImageView(this);
   iv.setBackgroundResource(imageRes[i]);
   list.add(iv);

   // 往线性布局中添加小圆点
   View view = new View(this);
   // 布局参数:指定宽,高.
   LayoutParams params = new LayoutParams(40, 40);
   view.setLayoutParams(params);
   params.leftMargin = 5;
   view.setBackgroundResource(R.drawable.dot_normal);
   llPoints.addView(view);
  }
  return list;
 }

 // 初始化控件
 private void initView() {
  mVp = (ViewPager) findViewById(R.id.vp);
  tvTitle = (TextView) findViewById(R.id.tv_title);
  llPoints = (LinearLayout) findViewById(R.id.ll_points);
 }

 // 得到标题的内容
 private String[] getTitles() {

  return new String[] { "干露露和她不要face的妈咪", "朴树又回来啦...", "东风吹来一地鸡毛.",
    "乐视TV送电视啦", "屌丝的逆袭" };
 }

 // 得到图片的资源id
 private int[] getImageRes() {

  return new int[] { R.drawable.a, R.drawable.b, R.drawable.c,
    R.drawable.d, R.drawable.e };
 }

 /************************* ViewPager页面切换的监听 ********************************/

 // 当页面滚动状态发生改变的时候调用.空闲状态:idle;触摸并滚动:touch_scroll;猛动:fling
 @Override
 public void onPageScrollStateChanged(int state) {

 }

 // 当页面滚动的时候...
 // position:位置;offset:在屏幕上移动的百分比:0--1;distance:移动的真实的距离,以像素为单位.
 @Override
 public void onPageScrolled(int position, float offset, int distance) {

  // Log.i("TAG", "arg0=" + position + ",arg1=" + offset + ",arg2="
  // + distance);
 }

 // 当页面被选中的时候调用
 @Override
 public void onPageSelected(int position) {

  // 改变标题
  tvTitle.setText(titles[position % list.size()]);

  // 改变当前位置的小圆点背景图
  llPoints.getChildAt(position % list.size()).setBackgroundResource(
    R.drawable.dot_enable);
  // 改变前一个位置的小圆点背景图
  llPoints.getChildAt(prePosition).setBackgroundResource(
    R.drawable.dot_normal);
  // 改变prePosition的值
  prePosition = position % list.size();

 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  isLoop = false;
 }

}
Adapter:

public class MyAdapter extends PagerAdapter {

 private List<ImageView> mList;

 public MyAdapter(List<ImageView> list) {
  this.mList = list;
 }

 // 用来决定ViewPager中子视图的个数.
 @Override
 public int getCount() {

  // return mList != null ? mList.size() : 0;
  return Integer.MAX_VALUE;
 }

 // 用来产生一个条目.
 // container:指的就是ViewPager;position:每个条目的位置.
 @Override
 public Object instantiateItem(ViewGroup container, int position) {

  // 5:0----4
  // 10:0---9
  // 取余之后的范围:0---4

  // 将子视图添加到容器中
  container.addView(mList.get(position % mList.size()));

  return mList.get(position % mList.size());
 }

 // view==obj--->true:系统不会再次产生一个新的条目,而是复用以前的条目;
 // false:系统会产生一个新的条目来进行展示.
 // view:当前正在展示的那个子视图;obj:instantiateItem()方法的返回值.
 @Override
 public boolean isViewFromObject(View view, Object obj) {

  return view == obj;
 }

 // 篮子:ViewPager.容器
 // 鸡蛋:View.子视图
 // 母鸡:List.集合
 // 从容器中移除某个条目."篮子里放鸡蛋"
 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {

  container.removeView(mList.get(position % mList.size()));
 }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ViewPager嵌套ViewPager的实现可以通过使用Fragment来实现。具体步骤如下: 1. 创建外层ViewPager的适配器,内层ViewPager的适配器和内层ViewPager的Fragment适配器; 2. 在外层ViewPager的Fragment中创建内层ViewPager,并设置内层ViewPager的适配器为内层ViewPager的适配器; 3. 在内层ViewPager的Fragment中创建需要的子Fragment,并设置内层ViewPager的Fragment适配器为子Fragment的适配器。 代码示例: ```java public class OuterFragment extends Fragment { private ViewPager mInnerViewPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_outer, container, false); mInnerViewPager = view.findViewById(R.id.inner_view_pager); InnerPagerAdapter innerPagerAdapter = new InnerPagerAdapter(getChildFragmentManager()); mInnerViewPager.setAdapter(innerPagerAdapter); return view; } private class InnerPagerAdapter extends FragmentPagerAdapter { public InnerPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return InnerFragment.newInstance(position); } @Override public int getCount() { return 3; } } } public class InnerFragment extends Fragment { private ViewPager mSubViewPager; public static InnerFragment newInstance(int position) { InnerFragment fragment = new InnerFragment(); Bundle args = new Bundle(); args.putInt("position", position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_inner, container, false); mSubViewPager = view.findViewById(R.id.sub_view_pager); SubPagerAdapter subPagerAdapter = new SubPagerAdapter(getChildFragmentManager()); mSubViewPager.setAdapter(subPagerAdapter); return view; } private class SubPagerAdapter extends FragmentPagerAdapter { public SubPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return SubFragment.newInstance(position); } @Override public int getCount() { return 3; } } } public class SubFragment extends Fragment { public static SubFragment newInstance(int position) { SubFragment fragment = new SubFragment(); Bundle args = new Bundle(); args.putInt("position", position); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_sub, container, false); return view; } } ``` 其中,fragment_outer.xml、fragment_inner.xml和fragment_sub.xml分别对应外层ViewPager的Fragment、内层ViewPager的Fragment和内层ViewPager的子Fragment的布局文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值