Demo6 TabLayout(上)你会用适配器吗:ViewPager
来源:互联网 发布:天天秒杀 淘宝智阳家纺 编辑:程序博客网 时间:2024/05/12 22:48
适配器这个概念在android随处可见,基本上和数据绑定在一起的组件都要使用一个适配器与之配合使用。就像BaseAdapter之于ListView。今天我们的主角ViewPager要使用到的是一个特定的适配器:PagerAdapter。说明一下,ViewPager不是design组件库的成员,但是他与下一个出场的TabLayout有相当密切的关系,所以我们先来学习ViewPager。
ViewPager是我们用来视图切换的利器,绑定好适配器就可以实现滑动切换页面。老套路,还是从主布局开始,这里我们只让ViewPager占满这个屏幕:
main_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/Main_ViewPager" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v4.view.ViewPager></LinearLayout>
然后我们再创建三个布局,只有背景色就好了:
main_sub1_layout.xml:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light"></FrameLayout>
剩下的两个布局就不粘出来了,除了背景色都一样就好了。接下来的工作就是用代码把这三个布局加入到ViewPager了。提到适配器模式,主要要我们解决的问题就是数据、适配器和组件。对于数据,不用多说,List搞定;而组件当然就是ViwePager了;适配器前面提到,用PagerAdapter,这个就是今天的重点内容,PagerAdapter的使用。
我们以一个简单的例子说明问题:
MainActivity.java:
public class MainActivity extends AppCompatActivity { private List<View> viewList = new ArrayList<>(); //视图列表 private ViewPager viewPager = null; //ViewPager @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); //添加视图 viewList.add(getLayoutInflater().inflate(R.layout.main_sub1_layout, null)); viewList.add(getLayoutInflater().inflate(R.layout.main_sub2_layout, null)); viewList.add(getLayoutInflater().inflate(R.layout.main_sub3_layout, null)); viewPager = (ViewPager)findViewById(R.id.Main_ViewPager); viewPager.setAdapter(adapter); } //PagerAdapter private PagerAdapter adapter = new PagerAdapter() { @Override public int getCount() { return viewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(viewList.get(position)); return viewList.get(position); } };}
在onCreate里面的代码无非是对ViewPager的操作,我们主要研究的是实现ViewPager功能的代码。在Demo中我们实现了自己的PagerAdapter,其中重写了四个方法:
int getCount()
boolean isViewFromObject(View view, Object object)
void destroyItem(ViewGroup container, int position,Object object)
Object instantiateItem(ViewGroup container, int position)这四个也是最基本的方法,下面我们逐一搞定。
@Overridepublic int getCount() { return viewList.size();}
首先从最简单的getCount说起,这个方法跟其他一般的适配器一样,就是返回适配器数据项的个数(在这里为View的数目)。
@Overridepublic void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position));}
destroyItem也是比较好理解,就是在回收列表时在container中移除相应的子项,这里我们可以把container理解成ViewPager整体。
@Overridepublic Object instantiateItem(ViewGroup container, int position) { container.addView(viewList.get(position)); return viewList.get(position);}
这个方法是在加载ViewPager数据项的时候回调,在instantiateItem方法中我们做了两件事:把视图装载到container中;返回这个视图。
说明:不知道读者有没有留意到,这个函数的返回值是Object,这里的原因比较复杂,要想深入理解请阅读这篇博文: ViewPager 详解(二)—详解四大函数 作者:启舰
这里我们只使用一般的模式,即返回视图本身,所以接下来我们的最后一个方法就可以这样写:
@Overridepublic boolean isViewFromObject(View view, Object object) { return view == object;}
这个方法是ViewPager维护和管理内存时回调的方法之一,这里只有一条返回语句,因为我们在instantiateItem中返回视图类型,这个模式也是官方建议的方法。
运行程序,结果如下:
Demo源码下载地址:Demo6:ViewPager
- Demo6 TabLayout(上)你会用适配器吗:ViewPager
- TabLayout加ViewPager的适配器
- TabLayout+ViewPager(1)
- drawerlayout+(viewpager+tablayout)
- viewpager+fragment+tablayout适配器和fragment的一些应用
- TabLayout和ViewPager(一)
- TabLayout和ViewPager(二)
- TabLayout+ViewPager+Fragment(代码)
- ViewPager+TabLayout
- Viewpager+Tablayout
- TabLayout+ViewPager
- TabLayout+ViewPager
- TabLayout+viewPager
- ViewPager+TabLayout
- Tablayout+viewpager
- TabLayout +ViewPager
- tablayout+viewpager
- Tablayout + viewpager
- 这才叫做面试
- 设计模式总结篇系列:组合模式(Composite)
- HDU 4302 优先队列
- Codeforces Round #353 (Div. 2) D. Tree Construction (BST)
- 31. Next Permutation
- Demo6 TabLayout(上)你会用适配器吗:ViewPager
- 第十一周上机实践项目 项目1-点-圆-圆柱类的设计(3)
- HttpUtils
- 浅谈c++的继承
- 认识-冒泡算法
- Java HashMap的工作原理
- c++调试快捷键
- 【Raspberry Pi 3试用体验】+Opencv+python的人脸识别
- 离散数学知识点整理