欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ViewPager 的使用总结

程序员文章站 2024-03-05 12:42:18
在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流...

在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流畅!!

主要产生的类文件有activity,n个view,adapter,自定义的viewpager,n+1个布局文件

demo所用到文件

Android ViewPager 的使用总结

步骤:

创建activity

package com.example.myviewpager;

import java.util.arraylist;
import java.util.list;

import android.app.activity;
import android.content.context;
import android.graphics.color;
import android.os.bundle;
import android.support.v4.view.viewpager;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.textview;
/**
 * 主窗口
 * @author cgx
 *
 */
public class mainactivity extends activity implements onclicklistener {

 private context mcontext;
 private myviewpager mpager;// 页面内容
 private myviewpageradapter pageradapter = null;
 private textview t1, t2, t3;// 页卡头标
 private list<view> pagelist = new arraylist<view>();
 private view1 mview1;
 private view2 mview2;
 private view3 mview3;

 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_main);
 mcontext = this;
 initviews();
 initevents();
 initviewpager();
 }

 private void initviews() {
 // todo auto-generated method stub
 
 t1 = (textview) findviewbyid(r.id.text1);
 t2 = (textview) findviewbyid(r.id.text2);
 t3 = (textview) findviewbyid(r.id.text3);
 mpager = (myviewpager) findviewbyid(r.id.vpager);
 // 设置viewpager不允许滑动
 //mpager.setcanscroll(false);
 //一开始进入窗口的时候,默认第一个便签被选中
 t1.setbackgroundcolor(color.parsecolor("#ffff00"));
 t2.setbackgroundcolor(color.parsecolor("#ffffff"));
 t3.setbackgroundcolor(color.parsecolor("#ffffff"));
 }

 private void initevents() {
 // todo auto-generated method stub
 t1.setonclicklistener(this);
 t2.setonclicklistener(this);
 t3.setonclicklistener(this);
 }

 private void initviewpager() {
 // todo auto-generated method stub

 pagelist.clear();

 if (mview1 == null) {
  mview1 = new view1(mcontext);
 }

 if (mview2 == null) {
  mview2 = new view2(mcontext);
 }

 if (mview3 == null) {
  mview3 = new view3(mcontext);
 }

 pagelist.add(mview1.getview());
 pagelist.add(mview2.getview());
 pagelist.add(mview3.getview());

 pageradapter = new myviewpageradapter(pagelist);
 // 缓存页面,如果想全部都缓存的话,参数等于页卡数减一,系统默认参数为1,保存两个
 mpager.setoffscreenpagelimit(2);
 mpager.setadapter(pageradapter);
 // 设置page改变监听器
 mpager.setonpagechangelistener(onpagechangelistener);
 }

 /**
 * simpleonpagechangelistener.该监听是当我们的viewpager页面切换的时候会触发 在里面我们会去改变 tab的聚焦情况
 * 。 因为实现上viewpager与actionbar是独立的,需要我们手动同步 。
 */
 viewpager.simpleonpagechangelistener onpagechangelistener = new viewpager.simpleonpagechangelistener() {
 @override
 public void onpageselected(int position) {
  /**
  * setselectednavigationitem 方法用于设置actionbar的聚焦tab .
  * 在接下来我们判断了slidingmenu的手*模式, 如果viewpager已经滑到了最左边,则我们把手势设置成全屏的,
  * 这样更往左滑动的时候,就会打开menu .
  */
  inittab(position);
 }

 // 初始化便签颜色
 private void inittab(int position) {
  // todo auto-generated method stub
  if (position == 0) {
  t1.setbackgroundcolor(color.parsecolor("#ffff00"));
  t2.setbackgroundcolor(color.parsecolor("#ffffff"));
  t3.setbackgroundcolor(color.parsecolor("#ffffff"));

  } else if (position == 1) {
  t1.setbackgroundcolor(color.parsecolor("#ffffff"));
  t2.setbackgroundcolor(color.parsecolor("#ffff00"));
  t3.setbackgroundcolor(color.parsecolor("#ffffff"));
  } else {
  t1.setbackgroundcolor(color.parsecolor("#ffffff"));
  t2.setbackgroundcolor(color.parsecolor("#ffffff"));
  t3.setbackgroundcolor(color.parsecolor("#ffff00"));
  }
 }
 };

 @override
 public void onclick(view v) {
 // todo auto-generated method stub
 switch (v.getid()) {

 case r.id.text1:// 点击第一个便签
  mpager.setcurrentitem(0, false);
  break;
 case r.id.text2:// 点击第二个便签
  mpager.setcurrentitem(1, false);
  break;
 case r.id.text3:// 点击第三个便签
  mpager.setcurrentitem(2, false);
  break;
 default:
  break;
 }
 }

}

自定义myviewpager

package com.example.myviewpager;

import android.content.context;
import android.support.v4.view.viewpager;
import android.util.attributeset;
import android.view.motionevent;

/**
 * 自定义滑动翻页可控,可通过设置iscanscroll参数来控制是否允许滑动切换页面
 */
public class myviewpager extends viewpager {
 /** 是否允许滑动翻页 ,默认可滑动*/
 private boolean iscanscroll = true;

 public myviewpager(context context, attributeset attrs) {
 super(context, attrs);
 }

 public myviewpager(context context) {
 super(context);
 }

 public boolean iscanscroll() {
 return iscanscroll;
 }

 /** 设置是否可以滑动翻页 */
 public void setcanscroll(boolean iscanscroll) {
 this.iscanscroll = iscanscroll;
 }

 @override
 public void scrollto(int x, int y) {
 super.scrollto(x, y);
 }

 // 设置禁止滑动的关键
 @override
 public boolean ontouchevent(motionevent arg0) {
 if (!iscanscroll)
  return true;
 return super.ontouchevent(arg0);
 }

 @override
 public boolean onintercepttouchevent(motionevent arg0) {

 return super.onintercepttouchevent(arg0);
 }

 @override
 public void setcurrentitem(int item, boolean smoothscroll) {
 super.setcurrentitem(item, smoothscroll);
 }

 @override
 public void setcurrentitem(int item) {
 super.setcurrentitem(item);
 }

}

适配器:

package com.example.myviewpager;

import java.util.list;

import android.support.v4.view.pageradapter;
import android.view.view;
import android.view.viewgroup;
/**
 * viewpager适配器
 * */
public class myviewpageradapter extends pageradapter{

 
  private list<view> mlistviews; 
  
  public myviewpageradapter(list<view> mlistviews) { 
    this.mlistviews = mlistviews;//构造方法,参数是我们的页卡,这样比较方便 
  }
  
  @override 
  public void destroyitem(viewgroup container, int position, object object)  {   
    container.removeview(mlistviews.get(position));//删除页卡 
  } 

  @override 
  public object instantiateitem(viewgroup container, int position) { //这个方法用来实例化页卡
    container.addview(mlistviews.get(position), 0);//添加页卡 
    return mlistviews.get(position);
  } 
 
  @override 
  public int getcount() {      
    return mlistviews.size();//返回页卡的数目 
  } 
     
  @override 
  public boolean isviewfromobject(view arg0, object arg1) {       
    return arg0==arg1;//官方提示这样写
  }

}

第一个view

package com.example.myviewpager;

import android.content.context;
import android.view.layoutinflater;
import android.view.view;

/**
 * 第一个
 * @author cgx
 *
 */
public class view1 {

 private context mcontext;
 private view rootview;
 public view1(context mcontext) {
 // todo auto-generated constructor stub
 this.mcontext=mcontext;
 //加载布局
 rootview = layoutinflater.from(mcontext).inflate(
  r.layout.view1_layout, null);
 }
 
 public view getview(){
 return rootview;
 }
 
}

activity布局文件

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  >
 <linearlayout
    android:id="@+id/linearlayout1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff" >

    <textview
      android:id="@+id/text1"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1.0"
      android:gravity="center"
      android:text="页卡1"
      android:textcolor="#000000"
      android:textsize="20sp" />

    <textview
      android:id="@+id/text2"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1.0"
      android:gravity="center"
      android:text="页卡2"
      android:textcolor="#000000"
      android:textsize="20sp" />

    <textview
      android:id="@+id/text3"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:layout_weight="1.0"
      android:gravity="center"
      android:text="页卡3"
      android:textcolor="#000000"
      android:textsize="20sp" />
  </linearlayout>
   <com.example.myviewpager.myviewpager
    android:id="@+id/vpager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_weight="1.0"
    android:background="#000000"
    android:flipinterval="30"
     />
 

</linearlayout>

view1的布局

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:background="#123456" >
</linearlayout>

由于用于演示,所以view的布局只是用不同的背景色来区分,开发中具体要展示的布局可以直接在view的布局文件里面改。demo中的view都是参考第一个来写的,类似

总结。

实际开发中,虽然官方提供了很多api,真正等到要自己用的时候,还是自己在依照习惯再包装一层,成为自己的工具,这样以后就可以直接用了,上面的例子是我在实习期间总结的,鄙陋之处敬请原谅,也欢迎大家指出,一起学习(^_^)

代码链接:http://pan.baidu.com/s/1pjaf6gz

以上就是对android viewpager 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!