当前位置: 移动技术网 > 移动技术>移动开发>Android > Android ViewPager 的使用总结

Android ViewPager 的使用总结

2019年07月24日  | 移动技术网移动技术  | 我要评论

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

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

demo所用到文件

步骤:

创建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 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网