感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711

Android Adapter基本理解:

我的理解是:

1、一个有许多getter的类(就是getView(),getCount()....这些方法)

2、有多少个get方法?都是什么?

这些getter是特定的,你可以复写他们,全部的方法如下

其中一般我们只用复写getCount(),getView(),getItemId(),getItem()这四个方法

3、这些被谁调用?

这些getter是被android系统自行调用的(具体如何调用,作为像我这样的新手做稍微了解就好)

4、为什么要复写这些get方法?

复写这些getter是为了返回给android系统,自己想给的结果

5、android系统通过这些getter能得到什么?

得到这个view自身的一些信息

eg:以ListView中的Adapter为例,其中

public int getCount()

返回ListView中要显示的子View数量,就是item的总数量

public Object getItem(int position)

返回一个子View,即ListView中的一个子条目

public long getItemId(int position)

返回一个item的id,由参数position决定是哪个id

public View getView(int position, View convertView, ViewGroupparent)

后做详解

….

6、android系统得到这些为了干什么?

得到这些信息以便绘制出这个View,以及以怎么样的方式绘制…

View getview(int position, View convertview, ViewGroup
parent )的理解:

引用自:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html其中也有一案例帮助理解

一、原理的理解

工作原理:

  1. ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
  2. 一个新的视图被返回并显示

如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,下图是他的工作原理:

  1. 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
  2. ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
  3. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。

二、代码的理解

Google官方的demo代码:


  1. <span style="font-family:Courier New;font-size:12px;">public View getView(int position, View convertView, ViewGroup parent)
  2. {
  3. // A ViewHolder keeps references to children views to avoid unneccessary calls
  4. // to findViewById() on each row.
  5. ViewHolder holder;
  6. // When convertView is not null, we can reuse it directly, there is no need
  7. // to reinflate it. We only inflate a new View when the convertView supplied
  8. // by ListView is null.
  9. if (convertView == null)
  10. {
  11. convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
  12. Log.v("tag", "positon "+position+" convertView is null, "+"new: "+convertView);
  13. // Creates a ViewHolder and store references to the two children views
  14. // we want to bind data to.
  15. holder = new ViewHolder();
  16. holder.text = (TextView) convertView.findViewById(R.id.text);
  17. holder.icon = (ImageView) convertView.findViewById(R.id.icon);
  18. convertView.setTag(holder);
  19. }
  20. else
  21. {
  22. // Get the ViewHolder back to get fast access to the TextView
  23. // and the ImageView.
  24. holder = (ViewHolder) convertView.getTag();
  25. Log.v("tag", "positon "+position+" convertView is not null, "+convertView);
  26. }
  27. // Bind the data efficiently with the holder.
  28. holder.text.setText(DATA[position]);
  29. holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
  30. return convertView;
  31. }
  32. static class ViewHolder
  33. {
  34. TextView text;
  35. ImageView icon;
  36. } </span>

下两段引用自:http://blog.csdn.net/pkxiuluo01/article/details/7380974

convertView参数的理解:

每次显示一个item都调用一次getview方法但是每次调用的时候covertview为空(因为还没有旧的view),当显示完了之后。如果屏幕移动了之后,并且导致有些Item(也可以说是view)跑到屏幕外面,此时如果还有新的item需要产生,则这些item显示时调用的getview方法中的convertview参数就不是null,而是那些移出屏幕的view(旧view),我们所要做的就是将需要显示的item填充到这些回收的view(旧view)中去,最后注意convertview为null的不仅仅是初始显示的那些item,还有一些是已经开始移入屏幕但是还没有view被回收的那些item。

setTag()和getTag()的理解:

view的setTag和getTag方法其实很简单,在实际编写代码的时候一个view不仅仅是为了显示一些字符串、图片,有时我们还需要他们携带一些其他的数据以便我们对该view的识别或者其他操作。于是android 的设计者们就创造了setTag(Object)方法来存放一些数据和view绑定,我们可以理解为这个是view 的标签也可以理解为view 作为一个容器存放了一些数据。而这些数据我们也可以通过getTag() 方法来取出来。

到这里setTag和getTag大家应该已经明白了。再回到上面的话题,我们通过convertview的setTag方法和getTag方法来将我们要显示的数据来绑定在convertview上。如果convertview 是第一次展示我们就创建新的Holder对象与之绑定,并在最后通过return convertview 返回,去显示;如果convertview 是回收来的那么我们就不必创建新的holder对象,只需要把原来的绑定的holder取出加上新的数据就行了。

我理解过程中所看的文章:

源头上理解Adapter,以及一个案例

http://blog.csdn.net/chunqiuwei/article/details/39934169

帮助理解

http://blog.csdn.net/primer_programer/article/details/23064767


补充:提醒大家在item中不要有像Button一样可以点击的空间,否则listView的OnItemClickListener的设置会无效的

Android Adapter基本理解的更多相关文章

  1. android Adapter剖析理解

    UI控件都是跟Adapter(适配器)打交道的 Adapter: 是用来帮助控件填充数据的中间桥梁 (在开发中大多数Textview控件的内容是依靠数据库传递并显示的如:新闻类) Adapter: 将 ...

  2. [转]Android Adapter以及getView()方法的理解

    Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些gett ...

  3. Android高手进阶:Adapter深入理解与优化

    一般是针对包含多个元素的View,如ListView,GridView,ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是 ...

  4. Android高手进阶——Adapter深入理解与优化

    Android高手进阶--Adapter深入理解与优化 通常是针对包括多个元素的View,如ListView,GridView.ExpandableListview,的时候我们是给其设置一个Adapt ...

  5. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  6. Android动画的理解

    基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...

  7. Android灯光系统--深入理解背光灯

    Android灯光系统--深入理解背光灯 一.怎么控制背光灯(简述) APP将亮度值写入数据库 线程检测数据库的值是否发生变化 这种机制成为"内容观察者"--contentObse ...

  8. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

  9. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

随机推荐

  1. Android物联网应用程序开发(智慧城市)—— 购物信息的存储界面开发

    效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  2. Redis缓存安装Version5.0.7

    1.说明 Redis是一个开源(BSD许可)的, 内存中的数据结构存储系统, 它可以用作数据库.缓存和消息中间件. 这里介绍在Linux下使用源码编译安装的方式. 2.下载 官方下载地址:https: ...

  3. Linux登录时,下游回显非常慢

    问题现象 登录linux时,远程连接正常,[root@...]回显非常慢,在执行脚本时,很容易导致命令下发错乱 原因分析 家目录下的.bash_history文件太大,导致每次登陆时读取这个文件耗时太 ...

  4. PowerShell【Do While、Do Until篇】

    1 $num=0 2 while($num -le 10) 3 { 4 $num 5 $num+=1 6 } 1 $num=0 2 do 3 { 4 $num 5 $num+=1 6 } 7 whil ...

  5. RabbitMQ --- 直连交换机 【 同步操作,等到消费者处理完后返回处理结果 】

    1.前言 RabbleMQ这种消息中间件,主要的功能是使用异步操作,来达到解耦的目的,比如,有系统a和系统b, 系统a通过消息中间件通知系统b来做业务,那么系统a只需要把要做的事情[也就是消息]发给消 ...

  6. 安装TestNG

    1.启动Eclipse,选择"Help"-->'Install New Software' 2.在谈出的弹框中选择"Add" 3.在弹出的"Ad ...

  7. JAVA SOCKET 详解

    概述 本人在开发学习NETTY的过程中,需要了解很多的网络开发知识,在此我总结一些关于socket的基础知识,大部分是网络总结,在此篇的随笔中记录socket的知识,以便于记录,如有问题欢迎大家斧正. ...

  8. Zabbix漏洞利用 CVE-2016-10134

    最近也是遇见了Zabbix,所以这里以CVE-2016-10134为例复现一下该漏洞 什么是Zabbix? zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. ...

  9. SSRF打内网redis

    0x00 redis基础 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用AN ...

  10. LabVIEW生成.NET的DLL——C#下调用NI数据采集设备功能的一种方法 [原创www.cnblogs.com/helesheng]

    LabVIEW是NI公司的数据采集设备的标准平台,在其上调用NI-DAQmx驱动和接口函数能够高效的开发数据采集和控制程序.但作为一种图形化的开发语言,使用LabVIEW开发涉及算法和流程控制的大型应 ...