ViewPager是v4支持库中的一个控件,相信几乎所有接触Android开发的人都对它不陌生。之所以还要在这里翻旧账,是因为我在最近的项目中有多个需求用到了它,觉得自己对它的认识不够深刻。我计划从最简单的使用场景出发,记录我到目前为止所对ViewPager的使用情况以及有关它的一些知识点。

这个系列的代码将存放在Github仓库中,每篇文章对应一个分支。

这是第一篇文章,讲述ViewPager最简单的使用场景,展示固定的数据。相关代码在分支:01-simple-usage可以获取。

使用ViewPager展示固定的数据,首先要做的就是定义自己的PagerAdapter,在这个PagerAdapter里面封装数据的使用方法。然后通过ViewPager的setAdapter方法关联数据就完成了。

定义PagerAdapter

下面是我实现的PagerAdapter,用于在ViewPager中展示字符串列表:

private static class UpdatePagerAdapter extends PagerAdapter {

    private List<String> texts;

    public UpdatePagerAdapter() {
texts = new ArrayList<>();
} @Override
public int getCount() {
return texts.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
} @Override
public Object instantiateItem(ViewGroup container, int position) {
String text = texts.get(position); TextView textView = new TextView(container.getContext());
textView.setText(text); container.addView(textView);
return textView;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
} public void setTexts(List<String> texts) {
this.texts.clear();
if (texts != null && texts.size() > 0) {
this.texts.addAll(texts);
}
notifyDataSetChanged();
}
}

这个PagerAdapter主要实现了四个方法,分别是getCount、isViewFromObject、instantiateItem、destroyItem。这些都是PagerAdapter在ViewPager中需要被使用到的方法,其中getCount、isViewFromObject由于是抽象方法,因此被要求必须实现。

看这四个方法的名称基本可以了解他们的作用。getCount方法用于告知ViewPager我们需要展示的数据的数目是多少;isViewFromObject用于告示ViewPager当前View是不是与第二个参数的object(问题1:这个方法的两个参数View和Object分别是做什么用的?)关联的;instantiateItem和destroyItem分别用户创建和销毁对象(问题2:为什么是xxxItem?类似ListView的适配器中getView的命名方式不是更贴切吗?例如instantiateView。)。

关联ViewPager与PagerAdapter

这个代码更简单了

// 初始化数据列表 testDataSource1
UpdatePagerAdapter adapter = new UpdatePagerAdapter();
adapter.setTexts(testDataSource1); ViewPager viewPager = (ViewPager) findViewById(R.id.vp_viewpager_update);
viewPager.setAdapter(adapter);

运行就可以看到你的数据展示在ViewPager里面了。

PagerAdapter关键方法理解

在实现PagerAdapter的时候我们留下了两个问题未解决。实际上这两个问题属于同源问题,是为了让数据与视图脱钩的解决方案。

实际上instantiateItem和destroyItem之所以命名为Item是因为ViewPager在渲染的时候在其内部实现了一个名为InfoItem的对象列表来表示我们的数据。这个列表作为中间者把ViewPager的所有子View与我们提供的数据关联在一起。这样做可以让ViewPager用少量的View展示我们提供的可能有点多的数据,节约内存。

以下是我自己画的ViewPager与PagerAdapter的关系图(原谅我不是专业设计师)

然而,数据是我们提供的,视图也是PagerAdapter委托我们自己实现的,ViewPager啥都不知道。因此怎么判断视图与其内部的item是否有关联的工作自然而然的也要委托给我们开发者来做。因此就有了isViewFromObject。

另一种PagerAdapter实现方案

接下来我将定义另一个PagerAdapter实现同样的功能。代码如下:

private static class Update2PagerAdapter extends PagerAdapter {

    private List<String> texts;

    public Update2PagerAdapter() {
texts = new ArrayList<>();
} @Override
public int getCount() {
return texts.size();
} @Override
public boolean isViewFromObject(View view, Object object) {
String text = (String) view.getTag();
return object.equals(text);
} @Override
public Object instantiateItem(ViewGroup container, int position) {
String text = texts.get(position); TextView textView = new TextView(container.getContext());
textView.setTag(text);
textView.setText(text); container.addView(textView);
return text;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = container.findViewWithTag(object);
if (view != null) {
container.removeView(view);
}
} public void setTexts(List<String> texts) {
this.texts.clear();
if (texts != null && texts.size() > 0) {
this.texts.addAll(texts);
}
notifyDataSetChanged();
}
}

主要的不同还在上述提到的三个方法实现。

首先在instantiateItem中我在创建了TextView之后,调用了setTag方法给这个视图打个标签。这个标签的值就是我们的数据text,接着text作为方法的返回传递到ViewPager内部的InfoItem中保存起来。

然后,当ViewPager需要判断数据和视图是否有关联的时候,调用isViewFromObject,传递出来View和Object。这个View就是上述的某个时候生成的TextView,Object就是返回的某个text。只要通过TextView的getTag方法读取标签,跟Object做一下对比就可以判断是否有关联。

最后当视图需要被删除的时候,以Object作为标签参数,调用ViewPager的findViewWithTag找视图,如果视图存在就从ViewPager中移除。

运行后发现效果跟前面的方案是一样的。

本文来自作者同步博客

ViewPager使用记录1——展示固定数据的更多相关文章

  1. ViewPager使用记录2——展示动态数据

    ViewPager是v4支持库中的一个控件,相信几乎所有接触Android开发的人都对它不陌生.之所以还要在这里翻旧账,是因为我在最近的项目中有多个需求用到了它,觉得自己对它的认识不够深刻.我计划从最 ...

  2. Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)

    简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...

  3. Saiku设置展示table数据不隐藏空的行数据信息(二十六)

    Saiku设置展示table数据不隐藏空的行数据信息 saiku有个 非空的字段 按钮,点击这个后,会自动的把空的行数据信息给隐藏掉,这里我们来设置一下让其行数据不隐藏,为空的就为空. 主要更改两个文 ...

  4. Saiku控制页面展示的数据过长自动换行(二十四)

    Saiku控制页面展示的数据过长自动换行 目前用到saiku来展示数据,发现数据文本过长也不会自动换行,然而用户那边又需要换行(会好看些),所以就来改一改源码啦 首先我们使用谷歌浏览器 inspect ...

  5. R绘制中国地图,并展示流行病学数据

    流行病学的数据讲究“三间分布”,即人群分布.时间分布和空间分布.其中的“空间分布”最好是在地图上展示,才比较清楚.R软件集统计分析与高级绘图于大成,是最适合做这项工作了.关于地图的绘制过程,谢益辉.邱 ...

  6. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  7. Android商城开发系列(七)—— 使用RecyclerView展示首页数据

    前面我们讲到了使用OkHttp请求网络和FastJson解析数据了,接下来我们就开始把获取到的数据通过数据适配器展示在页面上了.Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合 ...

  8. Tableau10.0学习随记-度量的聚合设置(取消度量汇总-展示所有数据)

    度量的聚合与取消聚合 a.根据度量指标分析时,有的度量值在直接拖取后,所展示的结果如下图所示: b.此时,如果需要展示所有数据的散点图,则可以取消菜单中的“分析-聚合度量”选项,如下图所示: c.调整 ...

  9. 【重大bug】viewpager使用的时候加载数据应该在setOnPageChangeListener里加载

    [重大bug]viewpager使用的时候加载数据应该在setOnPageChangeListener里的onPageSelected里加载,我说怎么首页有数据,第二页就是空白,就是加载了但是数据不显 ...

随机推荐

  1. unity调用c++ dll方法介绍

    摘要 unity用的很普遍,现在很多代码还是用c++写的,需要用unity去调用c++的代码.这里介绍了一种unity调用c++ dll的方法,希望有所帮助. 我采用的软件是Visual Studio ...

  2. 第二次项目冲刺(Beta阶段)5.22

    1.提供当天站立式会议照片一张 会议内容: ①检查前一天的任务情况,将遇到的困难反馈.解决. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 王婧 #53(完成) ...

  3. Swing-JSlider用法-入门

    JSlider是Swing中的滑块控件,在交互过程中用户可拖动它来实现数值的调整.它具有3个基本参数,分别为:最小值.最大值和初始值,如果不指定数值,则默认值分别为:0,100,50.滑块的值发生改变 ...

  4. Linux下安装oracle jdk

    从官网下载对应的 .tar.gz压缩文件. 在linux某个目录下解压 到根目录下的etc文件夹下编辑profile文件,在文件的末尾加上 JAVA_HOME=/usr/local/jdk1.8.0_ ...

  5. 201521123066 《Java程序设计》 第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 1.clone方法 1.1 Object对象中的clone ...

  6. 201521123019 《Java程序设计》第5周学习总结

    1. 本章学习总结 2. 书面作业 一.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. Ans ...

  7. 201521123038 《Java程序设计》 第十一周学习总结

    201521123038 <Java程序设计> 第十一周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多 ...

  8. 201521123027 <java程序设计>第十周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 异常: 多线程: 2.书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  9. 语句的分号、逗号和函数中var的使用

    1语句 分号 语句的结尾的分号不是必须的,但建议不要省略它,避免错误. 2逗号 1同时定义多个变量用逗号分开 2数组的最后一位,建议不要加上逗号,在有的浏览器中会导致,在逗号后添加一个undefine ...

  10. Spring @RequestParam乱码问题

    在网上找了很多资料才找到解决的方法,通过URL传递命名参数,后台接收的却是乱码解决方法如下: 方法一:将接收的参数重新编码 @RequestMapping(value="/handle&qu ...