BaseAdapter获取View之三重境界
在BaseAdapter获取View之前,BaseAdapter需要与数据源相关联。
可以使用构造方法:
private List<ItemBean> baseListItems;
private LayoutInflater mInflate; //布局装载器
public MyBaseAdapter(Context context,List<ItemBean> listItems){
baseListItems = listItems; //将数据源与数据适配器关联
mInflate = LayoutInflater.from(context); //初始化布局装载器
}
BaseAdapter获取View分三种:逗比式,普通式,文艺式。
逗比式:需要多次新建View,没有充分利用列表组件(ListView,GridView)的缓冲机制,有浪费很大资源的嫌疑。
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
View view = mInflate.inflate(R.layout.simple_item, null); //重复新建View.其中mInflate 为布局装载器,可从要使用的当前的Adapter的界面对象获得.
ImageView imageView = (ImageView) view.findViewById(R.id.header);
TextView personName = (TextView) view.findViewById(R.id.personName);
TextView desc = (TextView) view.findViewById(R.id.desc);
//创建列表项对应的Bean对象
BaseItemBean itemBean = baseListItems.get(i);
//给个组件赋值
imageView.setImageResource(itemBean.Header);
personName.setText(itemBean.PersonName);
desc.setText(itemBean.Desc);
return view;
}
普通式:利用了ListView的缓存机制。
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
if (convertView == null) { //判断缓存池中是否有当前列表项布局对应的view,当为null时,使用布局装载器转换,否则直接使用
convertView = mInflate.inflate(R.layout.simple_item, null); //避免了重复的创建大量的convertView.
}
ImageView imageView = (ImageView) convertView.findViewById(R.id.header);
TextView personName = (TextView) convertView.findViewById(R.id.personName);
TextView desc = (TextView) convertView.findViewById(R.id.desc);
//创建列表项对应的Bean对象
BaseItemBean itemBean = baseListItems.get(i);
//给个组件赋值
imageView.setImageResource(itemBean.Header);
personName.setText(itemBean.PersonName);
desc.setText(itemBean.Desc);
return convertView;
}
文艺式:在普通式中,虽然利用了listView的缓存机制,避免了convertView的重复创建,但仍然存在多个findViewByID() 操作,浪费了大量的资源,为了避免此情况,使用内部类ViewHolder。。。
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflate.inflate(R.layout.simple_item, null);
viewHolder = new ViewHolder(); //初始化ViewHolder
//在创建完convertView后将列表项中的各组件保存到ViewHolder中
viewHolder.Header = (ImageView) convertView.findViewById(R.id.header);
viewHolder.PersonName = (TextView) convertView.findViewById(R.id.personName);
viewHolder.Desc = (TextView) convertView.findViewById(R.id.desc);
//通过setTag将ViewHolder与convertView绑定
convertView.setTag(viewHolder);
}else {
//当convertVIew不为空时,通过getTag获取ViewHolder对象
viewHolder = (ViewHolder) convertView.getTag(); }
//给convertView个组件赋值
BaseItemBean itemBean = baseListItems.get(i);
viewHolder.Header.setImageResource(R.mipmap.ic_launcher);
viewHolder.PersonName.setText(itemBean.PersonName);
viewHolder.Desc.setText(itemBean.Desc);
return convertView;
}
//创建内部类ViewHolder,需要类中的各变量与列表项的各单元组件相对应
public class ViewHolder{
public ImageView Header;
public TextView PersonName;
public TextView Desc;
}
总结:在开发过程中,应尽量使用文艺式,这样有利于充分利用资源,同事优化了开发效率。
BaseAdapter获取View之三重境界的更多相关文章
- 获取View的截图-将View转换为Bitmap对象
开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...
- 在渲染前获取 View 的宽高
在渲染前获取 View 的宽高 这是一个比较有意义的问题,或者说有难度的问题,问题的背景为:有时候我们需要在view渲染前去获取其宽高,典型的情形是,我们想在onCreate.onStart.onRe ...
- 解决在onCreate()过程中获取View的width和Height为0的4种方法
很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid ...
- view--4种Android获取View宽高的方式
有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View ...
- spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程
整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:reques ...
- [Android学习笔记]获取view的尺寸和坐标
对于UI方面很多时候需要获取它的很多信息,具体情况见view的文档 View文档 http://developer.android.com/training/index.html 常用方法:获取vie ...
- android学习8——获取view在屏幕上的绝对坐标
获取view在屏幕上的绝对坐标在调试时候非常有用. 看如下代码 public class AbsolutePosActivity extends Activity { @Override public ...
- PHP解耦的三重境界(浅谈服务容器)
阅读本文之前你需要掌握:PHP语法,面向对象 在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就"失控"了,渐渐&q ...
- Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?
在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...
随机推荐
- MySQL 学习三 关于转义
DB2 LIKE谓词查询语句中支持 百分号(%).下划线(_)的使用,不支持方括号([])(注:它会把方括号当成实际的值而非通配符),当我们需要在LIKE 查询条件中将百分号(%).下划线(_)作为实 ...
- 【win10激活问题】 从【win10专业工作站版】转为 数字许可证的【win10专业版】
今天安装了 win10 1903 (10.0.18362 暂缺 Build 18362) 安装时 选的 是[win10 专业工作站版] 却无法激活, (因为当初是从win7升级上win10的,只有关联 ...
- matlab在处理图像时为什么把数据转换为double型?
1 有些函数支持double型,而不支持uint8的数据类型,所以要转换 2 精度问题了,因为uint8进行数据处理的时候,容易造成数据溢出或精度不够. 为了节省存储空间,matlab为图像提供了特殊 ...
- UVa 11404 Palindromic Subsequence (LCS)
题意:给定一个字符串,问删除一些字符,使得它成为一个最长回访串,如果有多个,输出字典序最小的那个. 析: 我们可以把原字符串反转,然后求两个串的LCS,就得到最长回文串,不过要注意一些细节. 代码如下 ...
- Image Processing - Pseudo(False) Color Processing
最近在一个项目中有需要用到将图片从GrayScale转为FalseColor,然而百度了一下Halcon 伪彩色等关键字均找不到相关答案,倒是有很多OpenCV和Matlab的...后来在搜索中看到了 ...
- 关于$_SERVER['PHP_SELF']用法及其安全性---改良
网站来源:http://www.5idev.com/p-php_server_php_self.shtml PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题 PH ...
- codeforces986F Oppa Funcan Style Remastered【线性筛+最短路】
容易看出是用质因数凑n 首先01个因数的情况可以特判,2个的情况就是ap1+bp2=n,b=n/p2(mod p1),这里的b是最小的特解,求出来看bp2<=n则有解,否则无解 然后剩下的情况最 ...
- 基于testcontainers的现代化集成测试进阶之路
大型的软件工程项目除了大量的产品级代码外必不可少的还有大量的自动化测试.自动化测试包含从前端到后端甚至到产品线上不同模块和环境的各种类型的测试.一个比较经典的关于自动化测试分布的理论就是测试金字塔,是 ...
- NetCore + Mysql + EF:No coercion operator is defined between types 'System.Int16' and 'System.Boolean',
总结三种解决办法: 1.Mysql升级到7 2.Nuget安装Pomelo.EntityFrameworkCore.MySql 2.2.0替代MySql.Data.EntityFrameworkCor ...
- C 语言实例 - 输出九九乘法口诀表
C 语言实例 - 输出九九乘法口诀表 使用嵌套 for 循环输出九九乘法口诀表. 实例 #include<stdio.h> int main(){ //外层循环变量,控制行 ; //内层循 ...