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是谷歌公司为了解决当前版本碎片化的问题,从而提供的一 ...
随机推荐
- UITabBarController的使用和坑
本人apem 说到UITabBarController, 最首要的坑就是tabbar的图片不显示的问题 1. tabbar上的图片一定要2套以上, 例如一个uitabbaritem的image是 se ...
- [codeforces 339]E. Three Swaps
[codeforces 339]E. Three Swaps 试题描述 Xenia the horse breeder has n (n > 1) horses that stand in a ...
- 教你搭建SpringSecurity3框架( 更新中、附源码)
源码下载地址:http://pan.baidu.com/s/1qWsgIg0 一.web.xml <?xml version="1.0" encoding="UTF ...
- Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]
在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1 SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可 ...
- (转)android图片压缩总结
原文地址:http://blog.csdn.net/cherry609195946/article/details/9264409 一.图片的存在形式 1.文件形式(即以二进制形式存在于硬盘上)2.流 ...
- C/C++相对论——C++中为什么要使用异常?
C++中为什么要使用异常? 很多人也许知道C++中的异常机制,很多人也许不知道.很多人知道C中常用的assert,也知道在编译时候指定NODEBUG来忽略它. 对于C语言,使用正常的if-else即是 ...
- ndk学习11: linux内存管理
1. 进程地址空间 2.内存管理 栈上分配空间 alloca() 栈上分配大小 strdupa() 拷贝一个字符串到栈上(显然这个函数不安全) ...
- 求教Sublime Text2 SublimeLinter插件安装问题
昨天装了 SublimeLinter插件(代码语法检测),这个事插件的地址:https://github.com/Kronuz/SublimeLinter 按照作者的介绍配置了一下,发现语法检测不起作 ...
- Sublime text2 插件推荐
HTML-CSS-JS Prettify: 前端插件,使用 ctrl+shift+h 格式化代码
- linux (RHEL) 添加和删除用户
linux添加新用户使用 useradd -----create a new user or update default new user information 删除用户使用userdel -- ...