对于BaseAdapter相信大家都不陌生,都知道该怎样用、怎样显示数据、怎样尽可能的把每个item做的令自己满意。但问题来了:有些朋友会说我界面做的非常的漂亮,数据也显示的非常完美,但是问什么我的ListView会如此的卡呢?

呵呵,今天我们就来解决这个问题。(关于优化,和解决listview卡的问题)

ListView的绘制机制:当系统开始好绘制ListView的时候,首先会调用getCount()方法(该方法的返回值实际是listview调用AdapterView的getCount()方法得到的)的到其返回值,即ListView的Item个数,返回值是多少就会绘制多少个item(即调用多少次BaseAdapter的getView)。之后系统会调用BaseAdapter的getView方法绘制每一个Item。最后就会在页面上呈现出我们想要的效果。

通过上面的绘制机制我们可以看出:要想对BaseAdapter进行优化实际上优化的是BaseAdapter的getView方法,因为一旦listview开始绘制必定会调用getView方法。

怎么优化呢?

一、一点都没有优化的getView:

@Overridepublic View getView(final int position, View convertView, ViewGroup arg2) {convertView = inflater.inflate(R.layout.p_item, null);Button btn = (Button)convertView.findViewById(R.id.p_item_btn);return convertView;}

上面的getView就是没有做任何处理的getView()此方法在ListView每次绘制的时候都会创建R.layout.p_item布局,并且每次都会创建该布局中的Button按钮。

如果该布局item非常复杂(例如:有几个ImageView和几个button、几个TextView)这就极大的耗费了系统的性能

二、重用主布局item文件:

@Overridepublic View getView(final int position, View convertView, ViewGroup arg2) {if (convertView == null) {convertView = inflater.inflate(R.layout.p_item, null);}Button btn = (Button)convertView.findViewById(R.id.p_item_btn);return convertView;}

我们在创建convertView之前加上一个是否为空的判断,如果为空才创建不为空则不创建,这样就不用每次创建getview的时候都重新创建布局了。对布局重用就好了

(这种方法也是很多朋友一直都使用的方法)

三、重用布局Item,并且重用布局中的控件。

class MyBaseAdapter extends BaseAdapter{/*** 添加一个内部类来存储Item中的所有有可能使用到的控件* 充当临时缓存来用* @author yw-tony**/class ViewHolder{Button btn;}private LayoutInflater inflater;private Context context;public MyBaseAdapter(Context context) {inflater = LayoutInflater.from(context);this.context = context;}List<String> ris = new ArrayList<String>();public void setList(List<String> ris) {this.ris = ris;}@Overridepublic int getCount() {return ris.size();}@Overridepublic Object getItem(int arg0) {return ris.get(arg0);}@Overridepublic long getItemId(int arg0) {return arg0;}@Overridepublic View getView(final int position, View convertView, ViewGroup arg2) {ViewHolder holder = null;//初始化ViewHolderif (convertView == null) {convertView = inflater.inflate(R.layout.p_item, null);holder = new ViewHolder();holder.btn = (Button)convertView.findViewById(R.id.p_item_btn);}holder.btn.setText("测试");return convertView;}}

使用这种方法来处理BaseAdapter会极大的提高baseadapter的性能,因为不仅布局Item重用了,而且item中的控件也重用了。因此在ListView进行绘制的时候时间上getView方法只用初始化布局一次就能够多次使用。非常的节省性能。

好了,本文到此就结束了,希望对大家有所帮助,如果有不同意见欢迎提出来大家共同讨论。

转载于:https://www.cnblogs.com/tony-yang-flutter/p/3411912.html

Android 对BaseAdapter做优化处理相关推荐

  1. Android 使用Listview的优化

    Listview是Android中很重要的一个组件,在开发过程中使用到的Listview能站到30%,在新手开发过程中,往往会忽略对Listview的优化,在上一个项目的开发中,确实用到了很多List ...

  2. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  3. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

    文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...

  4. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  5. Android之BaseAdapter—convertView回收机制与动态控件响应

    前言:对于listView的BaseAdapter的派生,难度比较大.最难理解的莫过于getView(int position, View convertView, ViewGroup parent) ...

  6. android 自定义baseadapter listview,android之ListView和BaseAdapter的组合使用

    BaseAdapter是基本适配器,功能强大,凡是能用ArrayAdapter和SimpleAdapter解决的,都可以使用BaseAdapter解决. BaseAdapter是一个抽象类,所以需要自 ...

  7. android加法服务类,iOS越来越像Android:苹果简单做加法远离精致

    原标题:iOS越来越像Android:苹果简单做加法远离精致 刚刚结束的WWDC2016的主题演讲中,苹果为我们带来了最新的iOS 10系统,官方称本次iOS 10的推出有着多大10项的重要更新,在用 ...

  8. android 6.0电池优化,Android 优化——电量优化

    WakeLock Android 系统本身为了优化电量的使用,会在没有操作时进入休眠状态,来节省电量.当然,为了便于开发(很多应用不可避免的希望在灭屏后还能运行一些事儿,或是要保持屏幕一直亮着--比如 ...

  9. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

最新文章

  1. Sqlite3 日常使用备忘录
  2. CCS新建BIOS工程的设置问题
  3. POJ - 1284 Primitive Roots(原根+欧拉函数)
  4. 算法随笔一(背包问题)
  5. 周三直播丨Oracle 12cR2 ADG LGWR Library Cache案例分享
  6. 容器化RDS|计算存储分离 or 本地存储?
  7. 【ML小结12】隐马尔科夫模型HMM
  8. 顺序表的十个基本操作(全)
  9. unbutu服务器误删文件,ubuntu中恢复rm命令误删文件
  10. 终极QQ-ZONE技巧
  11. 联想k50+开发者模式+linux,联想 K50-T5中文Recovery刷机教程
  12. Linux操作系统学习
  13. 移动端基础(2)—— flex弹性布局
  14. 上传文件到gitee仓库的步骤
  15. 高中计算机学业水平测试题目,2016年高中学业水平考试信息技术学科模拟题一(带答案)...
  16. wcf第3步之报文分析及原生调用
  17. 谷哥学术2022年2月份资源分享下载列表14/20
  18. 我的世界java版地图结构_我的世界地图种子竟然有42亿个 那些神奇的建筑都是怎么生成的...
  19. UPS电路图, 山特UPS电路图
  20. C语言实现LOL人机挂机辅助程序

热门文章

  1. SAP MM 采购单据的屏幕布局配置中字段选择值“$$$$”有什么用处?
  2. 心得丨老生常谈:普通程序员到底如何入门深度学习?
  3. 首次公开!深度学习在知识图谱构建中的应用
  4. 干货丨一文看懂生成对抗网络:从架构到训练技巧
  5. 机器学习虽好,也要看什么场合!
  6. 神经拟态芯片拉近AI与人脑距离
  7. 人工智能军备竞赛:一文尽览全球主要国家AI战略
  8. 10 年了,腾讯微信后台第一天提交的代码曝光 | 每日趣闻
  9. 去了两家外包公司,颠覆了我的认知!
  10. 以太坊创始人V 神:普通人看见现在,天才看见未来