Android 演示 ViewPager
本文内容
- 环境
- 项目结构
- 演示 1:PagerTitleStrip
- 演示 2:PagerTabStrip
- 演示 3:ViewPager 和动态 Fragment
下载 Demo
环境
- Windows 2008 R2 64 位
- Eclipse ADT V22.6.2,Android 4.4.2(API 19)
- SAMSUNG GT-8618,Android OS 4.1.2
项目结构

图 1 项目结构

图 2 项目主界面
演示 1:PagerTitleStrip
演示 1 和演示 2 都是利用已有的静态的 xml 页面布局,作为 Pager 的 tab 页。通过 LayoutInflater 将 xml 布局文件,变成 View,供 ViewPager 使用。


图 3 演示 PagerTitleStrip 和点击“微博”按钮
package com.example.viewpagerdemo2.ui;
import java.util.ArrayList;
import java.util.List;
import com.example.viewpagerdemo2.R;
import com.example.viewpagerdemo2.adapter.NewPagerAdapter;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
public class PagerTitleStripDemo extends Activity {
private View view1, view2, view3;
private ViewPager viewPager;
private NewPagerAdapter pagerAdapter;
private PagerTitleStrip myPagerTitleStrip;
private List<View> viewList;
private List<String> titleList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_title);
initClass();
initData();
initControl();
initViewPager();
}
private void initClass() {
viewList = new ArrayList<View>();
titleList = new ArrayList<String>();
}
private void initData() {
for (int i = 1; i <= 3; i++) {
titleList.add(String.format("演示1页%s", i));
}
LayoutInflater lf = LayoutInflater.from(this);
view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
}
private void initControl() {
viewPager = (ViewPager) findViewById(R.id.myViewPager1);
myPagerTitleStrip = (PagerTitleStrip) findViewById(R.id.myPagerTitleStrip);
pagerAdapter = new NewPagerAdapter(this, titleList, viewList);
}
private void initViewPager() {
myPagerTitleStrip.setBackgroundColor(getResources().getColor(
R.color.green));
myPagerTitleStrip.setTextSpacing(50);
viewPager.setAdapter(pagerAdapter);
}
}
演示 2:PagerTabStrip

图 4 演示 PagerTabStrip
package com.example.viewpagerdemo2.ui;
import java.util.ArrayList;
import java.util.List;
import com.example.viewpagerdemo2.R;
import com.example.viewpagerdemo2.adapter.NewPagerAdapter;
import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
public class PagerTabStripDemo extends Activity {
private View view1, view2, view3;
private ViewPager viewPager2;
private NewPagerAdapter pagerAdapter;
private PagerTabStrip myPagerTabStrip;
private List<View> viewList;
private List<String> titleList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
initClass();
initData();
initControl();
initViewPager();
}
private void initClass() {
viewList = new ArrayList<View>();
titleList = new ArrayList<String>();
}
private void initData() {
for (int i = 1; i <= 3; i++) {
titleList.add(String.format("演示2页%s", i));
}
LayoutInflater lf = LayoutInflater.from(this);
view1 = lf.inflate(R.layout.layout1, null);
view2 = lf.inflate(R.layout.layout2, null);
view3 = lf.inflate(R.layout.layout3, null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
}
private void initControl() {
viewPager2 = (ViewPager) findViewById(R.id.myViewPager2);
myPagerTabStrip = (PagerTabStrip) findViewById(R.id.myPagerTabStrip);
pagerAdapter = new NewPagerAdapter(this, titleList, viewList);
}
private void initViewPager() {
myPagerTabStrip.setTabIndicatorColor(getResources().getColor(
R.color.red));
myPagerTabStrip.setDrawFullUnderline(false);
myPagerTabStrip.setBackgroundColor(getResources().getColor(
R.color.green));
myPagerTabStrip.setTextSpacing(50);
viewPager2.setAdapter(pagerAdapter);
}
}
官方文档,对 PagerTabStrip 和 PagerTitleStrip 描述是,“PagerTabStrip is an interactive indicator of the current, next, and previous pages of a
ViewPager.” 而“PagerTitleStrip is a non-interactive indicator of the current, next, and previous pages of aViewPager. ”简单来说,PagerTabStrip 和 PagerTitleStrip 都能实现滑动切换 Tab 页,但是 PagerTabStrip 还通过点击 Tab 的标签实现 Tab 页的切换;而 PagerTitleStrip 则不能。
下面是演示 1 和演示 2 共用的 PagerAdapter。代码如下所示:
package com.example.viewpagerdemo2.adapter;
import java.util.List;
import com.example.viewpagerdemo2.R;
import com.example.viewpagerdemo2.ui.WeiBoActivity;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
public class NewPagerAdapter extends PagerAdapter {
private Activity activity;
private List<String> listTitle;
private List<View> listView;
private Button button;
private Intent intent;
public NewPagerAdapter(Activity activity, List<String> title,
List<View> view) {
this.activity = activity;
this.listTitle = title;
this.listView = view;
}
@Override
public int getCount() {
return listTitle.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(listView.get(position));
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
@Override
public CharSequence getPageTitle(int position) {
return listTitle.get(position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(listView.get(position));
button = (Button) container.findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
intent = new Intent(activity, WeiBoActivity.class);
activity.startActivity(intent);
}
});
return listView.get(position);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
}
ViewPager 控件都要配合一个 ***Adapter,这个 Adapter 或是 Android 提供,或是你新建 Adapter,并继承系统提供的 Adapter,然后调用 ViewPager.setAdapter 方法。
new 一个 Adapter 时,大都是将 Activity 和 adapter 构造自己需要的数据传递给他。
你会发现一个规律:只要有数据,控件就可以自己构造自己。通过 override 相应的方法,控件就知道自己的某个部分,应该利用你提供数据中的那个(些)数据。
演示 3:ViewPager 和动态 Fragment
动态 Fragment 在实际情况中,较为常用。

图 5 ViewPager 和动态 Fragment
package com.example.viewpagerdemo2.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.viewpagerdemo2.R;
import com.example.viewpagerdemo2.adapter.NewFragmentStatePagerAdapter;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
public class NewFragmentActivityDemo extends FragmentActivity {
private ViewPager mPager;
private NewFragmentStatePagerAdapter mAdapter;
private PagerTabStrip myPagerTabStrip;
private List<Map<String, String>> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
initClass();
initData();
initControl();
initViewPager();
}
private void initClass() {
list = new ArrayList<Map<String, String>>();
}
private void initData() {
for (int i = 1; i <= 3; i++) {
Map<String, String> cat = new HashMap<String, String>();
cat.put("name", "演示3页" + i);
cat.put("content", String.format("%s", i));
list.add(cat);
}
}
private void initControl() {
mPager = (ViewPager) findViewById(R.id.myViewPager2);
myPagerTabStrip = (PagerTabStrip) findViewById(R.id.myPagerTabStrip);
mAdapter = new NewFragmentStatePagerAdapter(
getSupportFragmentManager(), list);
}
private void initViewPager() {
myPagerTabStrip.setTabIndicatorColor(getResources().getColor(
R.color.red));
myPagerTabStrip.setDrawFullUnderline(false);
myPagerTabStrip.setBackgroundColor(getResources().getColor(
R.color.green));
myPagerTabStrip.setTextSpacing(50);
mPager.setAdapter(mAdapter);
}
}
自定义 Adapter,如下所示:
package com.example.viewpagerdemo2.adapter;
import java.util.List;
import java.util.Map;
import com.example.viewpagerdemo2.view.NewFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;
public class NewFragmentStatePagerAdapter extends FragmentStatePagerAdapter {
List<Map<String, String>> list;
public NewFragmentStatePagerAdapter(FragmentManager fm,
List<Map<String, String>> list) {
super(fm);
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public CharSequence getPageTitle(int position) {
return list.get(position).get("name");
}
// 初始化每个页卡选项
@Override
public Object instantiateItem(ViewGroup arg0, int position) {
NewFragment ff = (NewFragment) super.instantiateItem(arg0, position);
ff.setThings(list.get(position), position);
return ff;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
System.out.println("position Destory" + position);
super.destroyItem(container, position, object);
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return new NewFragment();
}
}
FragmentStatePagerAdapter 和 FragmentPagerAdapter 的区别是,FragmentStatePagerAdapter 在当前只会存在前一个 Fragment,其他 Fragment 会销毁,适合加载多数据;而FragmentPagerAdapter 是所有 Fragment 都存在,所以不太适合加载大量的数据 如图片什么的,很容易内存溢出。
每个 ViewPager 里的 Fragment,如下所示:
package com.example.viewpagerdemo2.view;
import java.util.Map;
import com.example.viewpagerdemo2.R;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class NewFragment extends Fragment {
private Map<String, String> ee;
private int position;
public void setThings(Map<String, String> ee, int position) {
this.ee = ee;
this.position = position;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
System.out.println("onCreateView = ");
View v = inflater.inflate(R.layout.fragment_pager, container, false);
((TextView) v.findViewById(R.id.myTitle)).setText(ee.get("name")
+ " = " + ee.get("content"));
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
System.out.println("onActivityCreated = ");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroyView() {
System.out.println("onDestroyView = " + position);
super.onDestroyView();
}
@Override
public void onDestroy() {
System.out.println("onDestroy = " + position);
super.onDestroy();
}
}
Android 演示 ViewPager的更多相关文章
- android下ViewPager的使用,带下部选项栏的切换动画
(文章针对类似我这种初学者,大神看到不要嘲笑) 演示 我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大): 代码: android中有View ...
- Android利用ViewPager实现滑动广告板
•android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其 ...
- Android 演示 Android ListView 和 github XListView(3-3)
本文内容 环境 项目结构 演示 1:简单 XListView 演示 2:XListView + Fragment 演示 3:XListView + ViewPager + Fragment 本文三个演 ...
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- android之ViewPager
在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
- Android 使用ViewPager实现左右循环滑动图片
ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一 ...
随机推荐
- C#访问远程主机资源的方法,多种方式
最近要实现访问远程主机的共享目录中的一个文件.遇到了权限问题.google了一下,找到了几种解决方法,记录如下: 一.调用Net use命令 // 使用方法: //if (Connect ...
- Cocos2d-x3.1TestCpp之NewRenderTest Demo分析
1.代码构成 VisibleRect.h VisibleRect.cpp AppDelegate.h AppDelegate.cpp HelloWorldScene.h HelloWorldScene ...
- wp使用上下文菜单
功能的实现需要toolkit中的MenuItem对象,具体实现方法有两种:XAML编程实现和.CS中代码实现: 1,XAML实现: 首先,在页面的xaml中加入引用: xmlns:toolkit=&q ...
- Windows Phone本地数据库(SQLCE):13、更新数据(翻译)
这是“windows phone mango本地数据库(sqlce)”系列短片文章的第十三篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的 ...
- poi workbook转成流
try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); workbook.write(bos); byte[] barray = ...
- Xcode 5中非常期待的6个功能
这里是新特征汇总博文链接:iOS7新特征汇总 小引: 自从北京时间2013年06月11日苹果发布Xcode 5 Developer Preview 1,到现在(2013年7约15日)已经过去一个月,苹 ...
- 通过Gson解析Json数据
Json是一种数据格式,便于数据传输.存储.交换:Gson是一种组件库,可以把java对象数据转换成json数据格式. gson.jar的下载地址:http://search.maven.org/#s ...
- 无需SherlockActionbar的SlidingMenu使用详解(二)——向Fragment中添加ViewPager和Tab
之前我们对大体框架有了一定的认识,现在我们来做Fragment界面,其实这里面和这个框架的关系就不大了,但因为有些同学对于在SlidingMenu中切换fragment还是有问题,所以我就在本篇进行详 ...
- C#里,如何模拟DataGridView里的一个Cell的Click事件。
//假设dgv是一个DataGridView. //我要点击第3行的第二个cell. //当然,要有一个点击事件.假设dgv_CellClick是那个点击事件. dgv_CellClick(dgv, ...
- Asp.Net 拦截请求自定义处理
需求: 在Aps.Net 应用中,对于浏览器请求的部分url的地址自定义处理,不交给路由系统或页面. 解决方案: 在全局文件Global.asax中 ,提供Application_BeginReque ...