Listview是Android中很重要的一个组件,在开发过程中使用到的Listview能站到30%,在新手开发过程中,往往会忽略对Listview的优化,在上一个项目的开发中,确实用到了很多Listview,但是没有这些Listview做过优化,软件在运行过程中会很占内存,肯定也包括这部分的原因了。所以在开发过程中要注重对Listview的优化。

现在测试一个BaseAdapter这个适配器下的优化。在主布局里面放置一个Listview。每一个item的布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="10dp"android:orientation="horizontal" ><ImageView android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher"/><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:orientation="vertical"><TextView android:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="张三"/><TextView android:id="@+id/tv_age"android:layout_marginTop="5dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#ff0000"android:text="28"/></LinearLayout></LinearLayout>

没有经过优化的实现:

<pre name="code" class="java">package com.example.baseadaptertest;import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {private ListView listview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listview = (ListView) findViewById(R.id.listview);listview.setAdapter(new MyBaseAdapter());}class MyBaseAdapter extends BaseAdapter{/*** 返回有多少列表项* */@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 20;}@Overridepublic Object getItem(int pasition) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View view, ViewGroup parent){LayoutInflater inflater = MainActivity.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);tvName = (TextView) view.findViewById(R.id.tv_name);tvAge = (TextView) view.findViewById(R.id.tv_age);tvName.setText("zhangsan" + position);tvAge.setText(String.valueOf(position + 28));return view;}}
}

注意到在getView这个方法中有一个参数 View view,这是一个缓存的view,用于缓存已经存在的view,从上面的程序可以看出,每次调用getView这个方法都会重新创建一个inflater,这样就会导致资源的浪费,所有充分利用到view这个东西。经过改造后的个头View方法。

<pre name="code" class="java">if(view == null) {// 布局填充器对象, 用于把xml布局转换成view对象LayoutInflater inflater = MainActivity2.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);tvName= (TextView) view.findViewById(R.id.tv_name);tvAge = (TextView) view.findViewById(R.id.tv_age);} else {view = view;}tvName.setText("zhangsan" + position);tvAge.setText(String.valueOf(position + 28));return view;

再次注意到一个问题,当view为空是每次都还要查找tvName和tvAge这两个组件,未免也会让费不少的资源。这个时候通常会定义一个ViewHolder,就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用。这样做的好处就是不必每次都到布局文件中去拿到你的View,提高了效率。

@Overridepublic View getView(int position, View view, ViewGroup parent) {ViewHolder holder = null;//复用,可以提升效率if (view == null) {LayoutInflater inflater = MainActivity.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);holder = new ViewHolder();holder.tvName = (TextView) view.findViewById(R.id.tv_name);holder.tvAge = (TextView) view.findViewById(R.id.tv_age);view.setTag(holder);}else {holder = (ViewHolder)view.getTag();}holder.tvName.setText("zhangsan" + position);holder.tvAge.setText(String.valueOf(position + 28));return view;}}static class ViewHolder {TextView tvName;TextView tvAge;}

这样对自定义的BaseAdapter的优化就OK了~

Android 使用Listview的优化相关推荐

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

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

  2. Android中ListView的优化

    ListView的优化方案有很多,主要是以下几点         1.  重用了convertView,减少了内存消耗.通过判断convertView是否为null,是的话就需要产生一个ViewHol ...

  3. Android中ListView数据处理优化

    来自:OPEN经验库 原帖:http://www.open-open.com/lib/view/open1330132229874.html Android 应用开发中,采用ListView组件来展示 ...

  4. Android Studio ListView框架+优化安卓应用市场实例

    直接使用ListView的基本步骤 获取数据 创建适配器 绑定适配器 需要实现重写的函数: getCount() 获取数据长度 getItem (int position) 获取项资源 getItem ...

  5. android中Listview的优化技巧

    2019独角兽企业重金招聘Python工程师标准>>> 减少内存中view对象的创建个数(明显提高效率)       复用历史缓存的view对象,减少Android内存消耗 减少子孩 ...

  6. Android之ListView原理学习与优化总结

    在整理前几篇文章的时候有朋友提出写一下ListView的性能优化方面的东西,这个问题也是小马在面试过程中被别人问到的-..今天小马就借此机会来整理下,网上类似的资料蛮多的,倒不如自己写一篇,记录在这个 ...

  7. Android ListView 的优化

    一.复用convertView.降低findViewById的次数 1.优化一:复用convertView Android系统本身为我们考虑了ListView的优化问题,在复写的Adapter的类中. ...

  8. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  9. Android ListView使用BaseAdapter与ListView的优化

    在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可 ...

最新文章

  1. 面试官:如果要存ip地址,用什么数据类型比较好
  2. Python使用matplotlib可视化发散棒棒糖图、发散棒棒糖图可以同时处理负值和正值、并按照大小排序区分数据、为发散棒棒糖图的特定数据点添加标签、自定义背景填充色、自定义数据点颜色
  3. Facebook 开源标准卷积替代方案 OctConv
  4. 翻转棋游戏c语言讲解,有没有人懂黑白棋(翻转棋)的核心算法
  5. 了解Callable和Spring DeferredResult
  6. matlab系统的初始条件,指定总线信号的初始条件
  7. java异常不懂,看不懂的异常提示啊
  8. 山东管理学院计算机二级,山东管理学院有几个校区及校区地址 哪个校区最好...
  9. 常用Latex表达式符号——组合数学篇
  10. python中trun是什么意思_Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解...
  11. 基于redis和R语言构建并行计算平台(yiyou)
  12. 浅谈python可视化编程之tkinter(一)
  13. 关于网页消息提示音问题解决与实现
  14. scratch编程体感游戏
  15. 大数据职业理解_大数据的职业发展规划
  16. GridSearchCV——信用卡违约率分析示例
  17. RabbitMQ配置文件_修改RabbitMQ MQTT的1883端口
  18. BootCDN——React入门学习
  19. 设置pip源为清华源或百度源
  20. 题库(1)_判断一个数是不是水仙花数

热门文章

  1. php多选批量修改数据库数据类型有哪些_php面试题之memcache和redis的区别
  2. vilatile 深入理解java虚拟机_《深入理解Java虚拟机》笔记 第十二章 volatile变量
  3. 做一名真正的软件工程师
  4. mysql 5.x数据库安装_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
  5. python 3.5opencv 环境搭建_Python3.5+openCv进行人脸识别的环境搭建(Windows下)
  6. STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
  7. 【BZOJ4500】矩阵(差分约束)
  8. 多文件的Makefile
  9. windows下使用salt安装软件
  10. LightOJ 1093 - Ghajini 线段树