Android ListView常见的优化方式详解

ListView的优化

对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式.

1.条目复用优化

  1. 其实listview的工作原理就是,listview在请求屏幕可见的item数时,convertView在getVIew中是null 的.
  2. 但是当屏幕向下滑动的时候(比如该屏幕尺寸可显示7条teim),在item1被隐藏,此时出现item8时,covertView的值就不为null 了,因为item1去填充它.
  3. 而如果不做复用处理的话,item8 则会继续去findviewById, 因此其实每个item里的View控件,竟然ID都是一样的,那我们其实可以利用covertView的复用原理,来优化listview,从而避免OOM异常.

详情见下图:

总结: 通过对上图的理解,那么我们得知listview的item是可以进行复用的,通过什么来复用?Android已经帮我们定义了一个方法getView(final int position, View convertView,ViewGroup parent) 里面的convertView 就是专门来处理复用的item的,因此我们只要对他处理就可以了.

2.优化findviewbyid

系统寻找子孩子id的方式: 从左向右,跟树状模式一样.

每次寻找子孩子都消耗很多的资源,但是子孩子的id都是被创建出来的,

也就是是说他们是固定的,竟然如此那么我们就可以对他进行优化;

系统找R.id的模式见下图:

总结: 通过对上图的理解,那么我们得知findviewbyid(id) 的底层操作太耗时了,如果一个布局里面有一百多层,那么我就单单是找一个小小的'ImageView' 都会找半天.幸好在2009年的google IO大会上,google的工程师推出了一个优化的方式 通过自定义一个viewholder类,来对view的id进行绑定,从而减少系统查找这样的耗时操作.

两种优化方案实际代码如下:

/**
 * @param position 位置
 * @param convertview 复用view

 * 历史回收的view对象. 当某个view对象被完全移除屏幕的时候 

 * 1. 尽量的复用converview(历史缓存的view),减少view对象创建的个数
 * 2. 尽量的减少子孩子id的查询次数 . 定义一个viewholder
 */

@Override
public View getView(final int position, View convertView,
    ViewGroup parent) {
  View view;
  ViewHolder holder;
  if (convertView != null) {
    // 复用历史view对象
    view = convertView;
    holder = (ViewHolder) view.getTag();
  } else {
    // 创建新的view对象
    view = View.inflate(getApplicationContext(),
        R.layout.item_callsmssafe, null);
    // 每次寻找子孩子消耗很多的资源cpu 内存.
    // 只有当子view对象第一次被创建的时候 查询id
    holder = new ViewHolder();
    holder.tv_mode = (TextView) view
        .findViewById(R.id.tv_black_mode);
    holder.tv_phone = (TextView) view
        .findViewById(R.id.tv_black_phone);
    holder.iv_delete_blacknumber = (ImageView) view
        .findViewById(R.id.iv_delete_blacknumber);
    view.setTag(holder);
}

/**
 * 子孩子id的容器
*/
static class ViewHolder {
  TextView tv_phone;
  TextView tv_mode;
  ImageView iv_delete_blacknumber;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android编程使用缓存优化ListView的方法

    本文实例讲述了Android编程使用缓存优化ListView的方法.分享给大家供大家参考,具体如下: ListView调用Adapter的getView方法获取每一个Item布局,将这些已经获得的Item布局放入缓存,将大大提高获取数据的效率,而且节省更多的流量,将数据进行缓存有两种方法是,一种是将内存缓存一种是sd卡缓存,在此分别进行演示. sd卡缓存: sd卡缓存是将下载的数据保存到sd卡中,当再次要获取数据时,首先要判断sd卡中是否存在,如果存在的话,就直接读取sd卡中的数据,如果不存在就

  • Android中ListView的几种常见的优化方法总结

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个textview: Activity: package com.alexchen.listviewoptimi

  • 浅谈Android开发中ListView控件性能的一些优化方法

    ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

  • Android ListView适配器(Adapter)优化方法详解

    Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍: Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源? ListView的Adapter的作用如下图所示: 先看看下面

  • Android ListView介绍及优化方案

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity" android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft=&

  • Android ListView优化之提高android应用效率

    ListView是一个经常用到的控件,ListView里面的每个子项Item可以使一个字符串,也可以是一个组合控件.Adapter是listview和数据源间的中间人. 当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图.触摸滚动时,频繁调用.支持成百上千条数据. 下面为显示每条数据的xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android中ListView Item布局优化技巧

    本文实例讲述了Android中ListView Item布局优化技巧.分享给大家供大家参考,具体如下: 之前一直都不知道ListView有多种布局的优化方法,只能通过隐藏来实现,自己也知道效率肯定是很低的,但是也不知道有什么方法,这些天又查了一些资料,然后知道 其实google早就帮我们想好了优化方案了. 假设你的ListView Item有三种布局样式的可能:就比如很简单的显示一行字,要靠左,居中,靠右. 这时我们就可以在BaseAdapter里面重写两个方法: private static

  • 实例讲解Android app开发中ListView的基本使用及优化

    一.直接使用ListView组件创建 1.直接在XML中创建ListView用entries属性附上一个数组资源 其中divider属性是设置分割线可以使用颜色和drawable资源分割 <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider=&

  • android listview优化几种写法详细介绍

    这篇文章只是总结下getView里面优化视图的几种写法,就像孔乙己写茴香豆的茴字的几种写法一样,高手勿喷,勿笑,只是拿出来分享,有错误的地方欢迎大家指正,谢谢. listview Aviewthatshowsitemsinaverticallyscrollinglist. 一个显示一个垂直的滚动子项的列表视图在android开发中,使用listview的地方很多,用它来展现数据,成一个垂直的视图.使用listview是一个标准的适配器模式,用数据--,界面--xml以及适配器--adapter,

  • Android ListView常见的优化方式详解

    ListView的优化 对于ListView来说,应该算是布局中几种最常用的组件之一了,使用也十分方便,下面个大家介绍一下两种常见的优化方式. 1.条目复用优化 其实listview的工作原理就是,listview在请求屏幕可见的item数时,convertView在getVIew中是null 的. 但是当屏幕向下滑动的时候(比如该屏幕尺寸可显示7条teim),在item1被隐藏,此时出现item8时,covertView的值就不为null 了,因为item1去填充它. 而如果不做复用处理的话,

  • Android ListView之EfficientAdapte的使用详解

    Android ListView之EfficientAdapte的使用详解 在做Android手机应用开发时, ListView是一个非常常用的控件.如何更新的使用它呢?其实SDK中的例子已经非常的完整了,并且能满足大多数的需要. 如果大家刚开始学习ListView,我建议大家还是直接先看官方的例子好了,这样大家会学到更好的写法以及养成更好的习惯. 下面就以EfficientAdapter为例,看看官网例子是如何使用ListView的: 请大家格外注意getView的书写方法,大家可能从网上也能

  • Android事件处理的两种方式详解

    安卓提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理. 基于监听的事件处理 基于监听的事件处理一般包含三个要素,分别是: Event Source(事件源):事件发生的场所,通常是各个组件 Event(事件):事件封装了界面组件上发生的特定事件(通常就是用户的一次操作) Event Listener(事件监听器):负责监听事件源发生的事件,并对各种事件作出相应的响应 下面使用一个简单的案例介绍按钮事件监听器 布局文件就是简单的线性布局器,上面是一个EditText,下面是一个Bu

  • vue虚拟滚动性能优化方式详解

    目录 引言 虚拟滚动(Virtual Scrolling) 理解虚拟滚动 虚拟 滚动 实现虚拟滚动 核心步骤 效果预览 最后 引言 一个简单的情景模拟(千万别被带入): A: 假设现在有 10 万条数据,你作为前端该怎么优化这种大数据的列表? B: 针对大数据列表一般不会依次性加载,会采用上拉加载.分页加载等方式实现优化. A: 那假如加载到最后一条数据的时候,页面上只是列表部分的数据就至少对应 10 万个 dom 节点,你觉得一个页面渲染至少 10 万个 dom 节点的性能如何? A: 如果这

  • Android ListView 条目多样式展示实例详解

    ListView的多种样式条目展示 这里给大家介绍一下简单的ListView的多种样式展示 在布局文件中和往常一样写一个ListViwe的布局 <ListView android:id="@+id/main_listview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 其他的这里就不多说了,直接介绍适配器里的操作 packag

  • Android  ListView 条目多样式展示实例详解

    ListView的多种样式条目展示 这里给大家介绍一下简单的ListView的多种样式展示 在布局文件中和往常一样写一个ListViwe的布局 <ListView android:id="@+id/main_listview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 其他的这里就不多说了,直接介绍适配器里的操作 packag

  • Android开发之基本控件和四种布局方式详解

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

  • Android Webview上的ssl warning的处理方式详解及实例

    Android Webview上的ssl warning的处理方式详解 前言: 因为最近遇到google pay上汇报的安全漏洞问题,需要处理ssl warning. 安全提醒 您的应用中 WebViewClient.onReceivedSslError 处理程序的实施方式很不安全.具体来说,这种实施方式会忽略所有 SSL 证书验证错误,从而使您的应用容易受到中间人攻击.攻击者可能会更改受影响的 WebView 内容.读取传输的数据(例如登录凭据),以及执行应用中使用 JavaScript 的代

  • Android 使用版本控制工具时添加忽略文件的方式(详解)

    Android Studio 配合SVN时,添加忽略文件相对简单,首先打开项目的Settings选项,切换到Version Control下的Ignored Files目录,如下图: ignore1.png 点击右上角绿色加号,出现如下对话框: ignore2.png 其中 Ignore specified file选项是忽略指定的文件 Ignore all files under选项是忽略指定文件夹下的文件 Ignore all files matching选项是忽略匹配指定格式的文件 一般需

  • Android 文件存储与SharedPreferences存储方式详解用法

    目录 持久化技术简介 文件存储 1. 将数据存储到文件中 2. 从文件中读取数据 SharedPreferences 存储 1. 将数据存储到 SharedPreferences 中 2. 从 SharedPreferences 中读取数据 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据也不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备的数据是处于持久状态的.持久化技术提供了一种机制,可以让数据在瞬时状态和持久状

随机推荐