zoukankan      html  css  js  c++  java
  • android BaseAdapter getView 理解

    ListView是安卓中很经常使用的一个控件。

    安卓设计使用Adapter来对ListView进行管理。

    可是系统提供的Adapter无法满足一些复杂的显示情况,这个时候我们就须要使用BaseAdapter来自行实现ListView的控制。

    其它的方法都非常好说。这里主要解释一下getView方法。

    首先ListView在设计时,为了保障系统的性能(毕竟是移动终端,系统资源有限),设计时并非无限载入ItemView进去的。

    试想一下,假设有1000条记录。难道要同一时候创建。并缓存1000个 ItemView对象吗?假设还包括图片等大型资源呢?

    显然是不现实的。所以安卓设计时,採用了例如以下设计思路。


    如上图所看到的。系统仅仅会创建一屏ItemView。详细个数依据屏幕显示控件计算得到。

    当第一个itemView彻底被遮盖时,系统会移动它作为最后一个ItemView显示。

    这样就保证始终仅仅有7个ItemView被实例化。

    可是显然Item8和Item1显示内容是不一样的,这时候。我们就须要用到GetView这种方法了。


    getView中的convertView,事实上就是屏幕显示的ItemView的引用。

    在第一屏数据显示是,convertView为空。由于他们都须要被又一次创建。

    在第二屏第一项数据被展示时。convertView就不在是空,而是被移动下来的第一屏第一项的View对象。

    这时候我们须要做的,就是又一次把新的数据填充上去,保证它显示的是第二屏第一项的数据就可以。

    详细參考链接:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

    至于我们经常见到的PlaceHolder这个东西,好吧,事实上他仅仅是一个经常使用的方式,为了不须要每次都又一次getViewByID。来获取对象引用。

    简单来说,就是用起来比較方便罢了。事实上你也没必要要用这东西。每次都从convertView中又一次获取也不是不行,就是浪费代码,浪费资源罢了。


    然后说说getView反复调用问题。多数都是因为重绘导致的。一般来说。奖Item的宽度和高度设置成fill_parent,尽量不要用match。这样会好非常多。

    假设须要又一次绘制viewlist。能够使用notifyDataSetChanged,主要是起到刷新界面的作用。

    详细參考链接:http://www.cnblogs.com/kissazi2/p/3721941.html


    嘛,最后吐槽一下,感觉安卓非常多控件设计的耦合性好高。并且即使想要自行分离变量,也非常困难。

    作者想要写一个通用的Adapter,吧GetView里面的可变因素抽象,开放出来,结果发现,真这样实现了导致好多接口对象的产生,感觉还不如一个页面一个Adapter来实现的方便,所以就不在这里献丑了。这也側面说明了,为什么安卓没有比較通用成熟的一些好的高速开发框架的原因。

  • 相关阅读:
    《代码整洁之道》三
    《代码整洁之道》二
    第五周总结
    第四周总结
    第三周总结
    第二周总结
    第一周总结
    课程总结
    周总结16
    河北省科技信息通用调查系统综合查询功能开发——Day9
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6755420.html
Copyright © 2011-2022 走看看