Android Tab -- 使用ViewPager、PagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877
效果:滑动切换,自动切换。

代码:https://github.com/ldb-github/Layout_Tab
1、布局界面通过ViewPager标签来实现视图左右切换。
2、然后通过LinearLayout增加指示器功能,表明当前展示的是第几个视图;其中指示器是通过两种小圆点图片来表示未显示和显示两种状态。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <android.support.v4.view.ViewPager
android:id="@+id/first_vp"
android:layout_width="match_parent"
android:layout_height="250dp" /> <LinearLayout
android:id="@+id/point_layout"
android:layout_width="match_parent"
android:layout_height="20dip"
android:layout_alignBottom="@id/first_vp"
android:background="#B8B8B8"
android:gravity="center_horizontal"
android:orientation="horizontal"> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/dian"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dip"
android:background="@drawable/dian"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dip"
android:background="@drawable/dian"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="20dip"
android:background="@drawable/dian"/> </LinearLayout> </RelativeLayout>
viewpager_pageradapter.xml
1、在原文的基础上
a、增加了isSlipped控制手动滑动后当前显示图片currentIndex与自动轮播what不一致问题。
b、增加isRunning控制退出Activity后,轮播线程继续在执行的问题。
2、ViewPager与PagerAdapter的一点关系:
viewPager.setCurrentItem() --> viewPager.populate() --> viewPager.addNewItem() --> adapter.instantiateItem()
public class ViewPagerAndPagerAdapterActivity extends Activity{
private static final String LOG_TAG =
ViewPagerAndPagerAdapterActivity.class.getSimpleName();
private ViewPager viewPager;
private ArrayList<View> list = new ArrayList<>();
// 底部点的布局
private LinearLayout pointLayout;
// 底部的点
private ImageView[] dots;
// 当前选中的索引
private int currentIndex;
private boolean flag = true;
// 自增int
private AtomicInteger what = new AtomicInteger(0);
private boolean isSlipped;
// 控制循环播放图片线程
private boolean isRunning;
private PagerAdapter pagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
Log.d(LOG_TAG, "In PagerAdapter.getCount()");
return list.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
Log.d(LOG_TAG, "In PagerAdapter.isViewFromObject()");
return view == object;
}
// viewPager.setCurrentItem() --> viewPager.populate() --> viewPager.addNewItem()
// --> adapter.instantiateItem()
// 在ViewPager.addNewItem()方法中调用
@Override
public Object instantiateItem(ViewGroup container, int position) {
Log.d(LOG_TAG, "In PagerAdapter.instantiateItem()");
container.addView(list.get(position));
return list.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.d(LOG_TAG, "In PagerAdapter.destroyItem()");
container.removeView(list.get(position));
}
};
private final Handler viewHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.d(LOG_TAG, "In Handler.handleMessage start");
viewPager.setCurrentItem(msg.what);
Log.d(LOG_TAG, "In Handler.handleMessage stop");
setDots(msg.what);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(LOG_TAG, "In onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.viewpager_pageradapter);
init();
initDots();
}
@Override
protected void onStart() {
Log.d(LOG_TAG, "In onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.d(LOG_TAG, "In onResume");
super.onResume();
isRunning = true;
loopPlay();
}
@Override
protected void onPause() {
Log.d(LOG_TAG, "In onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.d(LOG_TAG, "In onStop");
super.onStop();
isRunning = false;
}
@Override
protected void onDestroy() {
Log.d(LOG_TAG, "In onDestroy");
super.onDestroy();
}
private void init(){
isSlipped = false;
viewPager = (ViewPager) findViewById(R.id.first_vp);
LayoutInflater inflater = LayoutInflater.from(this);
View view1 = inflater.inflate(R.layout.viewpager_pageradapter_tab1, null);
View view2 = inflater.inflate(R.layout.viewpager_pageradapter_tab2, null);
View view3 = inflater.inflate(R.layout.viewpager_pageradapter_tab3, null);
View view4 = inflater.inflate(R.layout.viewpager_pageradapter_tab4, null);
list.add(view1);
list.add(view2);
list.add(view3);
list.add(view4);
viewPager.setAdapter(pagerAdapter);
// setOnPageChangeListener 弃用了
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
Log.d(LOG_TAG, "In OnPageChangeListener.onPageScrolled");
}
@Override
public void onPageSelected(int position) {
Log.d(LOG_TAG, "In OnPageChangeListener.onPageSelected");
isSlipped = true;
setDots(position);
}
@Override
public void onPageScrollStateChanged(int state) {
Log.d(LOG_TAG, "In OnPageChangeListener.onPageScrollStateChanged");
}
});
}
/**
* 初始化底部的点
*/
private void initDots(){
pointLayout = (LinearLayout) findViewById(R.id.point_layout);
dots = new ImageView[list.size()];
for(int i = 0; i < list.size(); i++){
dots[i] = (ImageView) pointLayout.getChildAt(i);
}
currentIndex = 0;
dots[currentIndex].setBackgroundResource(R.drawable.dian_down);
}
/**
* 当滚动时更换点的背景图
*/
private void setDots(int position){
if(position < 0 || position > list.size() - 1 || currentIndex == position){
return;
}
dots[position].setBackgroundResource(R.drawable.dian_down);
dots[currentIndex].setBackgroundResource(R.drawable.dian);
currentIndex = position;
}
/**
* 循环播放图片
*/
private void loopPlay() {
/**
* 开辟线程来控制图片左右轮播
*/
new Thread(new Runnable() {
@Override
public void run() {
Log.d(LOG_TAG, "Runnable.run isRunning = " + isRunning);
while (isRunning) {
Log.d(LOG_TAG, "In loopPlay.run isSlipped = " + isSlipped);
Log.d(LOG_TAG, "In loopPlay.run currentIndex = " + currentIndex);
// 处理手动滑动的情况
if (isSlipped) {
isSlipped = false;
Log.d(LOG_TAG, "In loopPlay.run isSlipped was recovered ");
what.set(currentIndex);
}
viewHandler.sendEmptyMessage(what.get());
if (what.get() >= list.size() - 1) {
flag = false;
}
if (what.get() < 1) {
flag = true;
}
if (flag) {
what.incrementAndGet();
} else {
what.decrementAndGet();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
ViewPagerAndPagerAdapterActivity.java
Android Tab -- 使用ViewPager、PagerAdapter来实现的更多相关文章
- Android Tab -- 使用ViewPager、PagerTitleStrip/PagerTabStrip来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...
- Android Tab -- 使用ViewPager、Fragment、FragmentPagerAdapter来实现
原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换:点击标签切换. 代码:https://github.com/l ...
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
- Android Tab类型主界面 Fragment+TabPageIndicator+ViewPager
文章地址: Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager 1.使用ViewPager + PagerAdapter 每个页面的内容都 ...
- android Tab =viewpager+fragmnet
1.定义几个fragment 的subclass 如fragmentone,fragmenttwo; public class fragmentthree extends Fragment { pri ...
- Android ViewPager PagerAdapter 图片轮播
ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的View类. ViewPager类需要一个PagerAdapter适配器类给它提供数据. ViewPager ...
- Android Material Design:ViewPager与android.support.design.widget.TabLayout双向交互联动切换
通常,android.support.design.widget.TabLayout与Android的ViewPager联合使用,实现与ViewPager的切换与联动.(1)比如,当用户手指触摸选择T ...
- Android开发之ViewPager
什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...
- Android学习之ViewPager
1.定义 ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view.其中,android.support.v4是谷歌公司为了解决当前版本碎片化的问题,从而提供的一 ...
随机推荐
- jQuery获取页面及个元素高度、宽度
获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档 ...
- 对C++虚函数、虚函数表的简单理解
一.虚函数的作用 以一个通用的图形类来了解虚函数的定义,代码如下: #include "stdafx.h" #include <iostream> using name ...
- Java解析采集模块
package step3; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; im ...
- 9.2---机器人走方格(CC150)
这题就是dp的一般题目 public static int countWays(int x, int y){ if( x < 0 || y < 0) return -1; int[][] ...
- ext 对齐
layout : { type : 'hbox', pack : 'end' } buttonAlign:'center', //按钮居中 pack : String Controls how t ...
- MyEclipse 优化
1.取消自动validation 有一堆,什么xml.jsp.jsf.js等等, 我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下! 取消方法: windows-->perfer ...
- Silverlight datagrid 排序 (转)
Silverlight的DataGrid有很多强大之处,其中一个便是排序. DataGrid指定过ItemsSource之后,通过点击列头就可以实现排序,不用写任何代码.这对我这种懒人来说实在是太爽了 ...
- 如何准确高效的获取数据库新插入数据的主键id
例如我们新建了一张表UserInformation,字段如下Id,为主键,自增,其它字段Name,Pwd,Email 然后我们来执行一个新增插入操作: insert into UserInformat ...
- Java程序优化的一些最佳实践(转)
衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析.其中,最常见的衡量标准是程序的时间复杂度.空间复杂度,以及代码的可读性.可扩展性.针对程序的时间复杂度和空间复杂度,想要优化程序代码,需要 ...
- 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转
今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...