在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之三重境界的更多相关文章

  1. 获取View的截图-将View转换为Bitmap对象

    开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...

  2. 在渲染前获取 View 的宽高

    在渲染前获取 View 的宽高 这是一个比较有意义的问题,或者说有难度的问题,问题的背景为:有时候我们需要在view渲染前去获取其宽高,典型的情形是,我们想在onCreate.onStart.onRe ...

  3. 解决在onCreate()过程中获取View的width和Height为0的4种方法

    很经常当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0.view.getWid ...

  4. view--4种Android获取View宽高的方式

    有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View ...

  5. spring mvc DispatcherServlet详解之三---request通过ModelAndView中获取View实例的过程

    整个spring mvc的架构如下图所示: 上篇文件讲解了DispatcherServlet第二步:通过request从Controller获取ModelAndView.现在来讲解第三步:reques ...

  6. [Android学习笔记]获取view的尺寸和坐标

    对于UI方面很多时候需要获取它的很多信息,具体情况见view的文档 View文档 http://developer.android.com/training/index.html 常用方法:获取vie ...

  7. android学习8——获取view在屏幕上的绝对坐标

    获取view在屏幕上的绝对坐标在调试时候非常有用. 看如下代码 public class AbsolutePosActivity extends Activity { @Override public ...

  8. PHP解耦的三重境界(浅谈服务容器)

    阅读本文之前你需要掌握:PHP语法,面向对象 在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就"失控"了,渐渐&q ...

  9. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

随机推荐

  1. Algorithms & Data structures in C++& GO ( Lock Free Queue)

    https://github.com/xtaci/algorithms //已实现 ( Implemented ): Array shuffle https://github.com/xtaci/al ...

  2. 使用BIND安装智能DNS服务器(三)---添加view和acl配置

    智能DNS的配置主要修改named.conf文件,利用view和acl来实现. acl文件内容,这里只列出一部分,具体详细的可以参考这个网址 纯真IP库,给出了十分详细的IP地址,下载安装后,打开软件 ...

  3. \n和\r\n的区别

    \r是回车符,\n是换行符计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好 ...

  4. cf769D(枚举&位或运算)

    题目链接:http://codeforces.com/problemset/problem/769/D 题意:求给出的 n 个数中有多少对数字的二进制形式恰好有 k 位不同 思路:两个数a, b的二进 ...

  5. 分层确定性钱包开发的代码实现(HD钱包服务)

    HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP3 ...

  6. 洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)

    传送门 咱用的是拆系数\(FFT\)因为咱真的不会三模数\(NTT\)-- 简单来说就是把每一次多项式乘法都改成拆系数\(FFT\)就行了 如果您还不会多项式求逆的左转->这里 顺带一提,因为求 ...

  7. jmter介绍及安装

    一.   Apache JMeter介绍 1.       Apache JMeter是什么 Apache JMeter 是Apache组织的开放源代码项目,是一个100%纯Java桌面应用,用于压力 ...

  8. 小程序,用js获取当前系统时间并显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. SpringMVC 控制器写多个方法(非注解方式)

    Controller类有两种方法 1,implements Controller(实现Controller接口) 2,extends MultiActionController(继承 MultiAct ...

  10. EOS帐户交易的构建命令

    EOS版本:4.0   系统:Ubuntu 16.04 LTS   1.创建两对密匙   cleos create key   Private key:5JeTwSwKfpVRHGLqysakTXfk ...