Android ListView 的优化

一、复用convertView,降低findViewById的次数

1、优化一:复用convertView

Android系统本身为我们考虑了ListView的优化问题。在复写的Adapter的类中,比較重要的两个方法是getCount()和getView()。界面上有多少个条显示。就会调用多少次的getView()方法;因此假设在每次调用的时候,假设不进行优化。每次都会使用View.inflate(….)的方法,都要将xml文件解析,并显示到界面上,这是很消耗资源的:由于有新的内容产生就会有旧的内容销毁,所以。能够复用旧的内容。

优化:

在getView()方法中。系统就为我们提供了一个复用view的历史缓存对象convertView。当显示第一屏的时候。每个item都会新创建一个view对象,这些view都是能够被复用的;假设每次显示一个view都要创建一个。是很耗费内存的。所以为了节约内存。能够在convertView不为null的时候。对其进行复用

2、优化二:缓存item条目的引用——ViewHolder

findViewById()这种方法是比較耗性能的操作,由于这种方法要找到指定的布局文件,进行不断地解析每一个节点:从最顶端的节点进行一层一层的解析查询,找到后在一层一层的返回,假设在左边没找到。就会接着解析右边。并进行对应的查询。直到找到位置(如图)。因此能够对findViewById进行优化处理,须要注意的是:

》》》》特点:xml文件被解析的时候,仅仅要被创建出来了,其孩子的id就不会改变了。依据这个特点。能够将孩子id存入到指定的集合中,每次就能够直接取出集合中相应的元素就能够了。

优化:

在创建view对象的时候。降低布局文件转化成view对象的次数;即在创建view对象的时候,把所有孩子所有找到,并把孩子的引用给存起来

①定义存储控件引用的类ViewHolder

这里的ViewHolder类须要不须要定义成static,依据实际情况而定,假设item不是非常多的话,能够使用,这样在初始化的时候。仅仅载入一次。能够略微得到一些优化

只是,假设item过多的话。建议不要使用。由于static是Java中的一个keyword,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量。它的生命周期是非常长的。假设用它来引用一些资源耗费过多的实例(比方Context的情况最多)。这时就要尽量避免使用了。

class ViewHolder{

//定义item中对应的控件

}

②创建自己定义的类:ViewHolder holder = null;

③将子view加入到holder中:

在创建新的listView的时候。创建新的ViewHolder。把所有孩子所有找到,并把孩子的引用给存起来

通过view.setTag(holder)将引用设置到view中

通过holder。将孩子view设置到此holder中。从而降低以后查询的次数

④在复用listView中的条目的时候。通过view.getTag(),将view对象转化为holder。即转化成对应的引用,方便在下次使用的时候存入集合。

通过view.getTag(holder)获取引用(须要强转)

二、ListView中数据的分批及分页载入:

需求:ListView有一万条数据,怎样显示;假设将十万条数据载入到内存,非常消耗内存

解决的方法:

优化查询的数据:先获取几条数据显示到界面上

进行分批处理---à优化了用户体验

进行分页处理---à优化了内存空间

说明:

一般数据都是从数据库中获取的,实现分批(分页)载入数据,就须要在相应的DAO中有相应的分批(分页)获取数据的方法。如findPartDatas ()

1、准备数据:

在dao中加入分批载入数据的方法:findPartDatas ()

在适配数据的时候,先载入第一批的数据,须要载入第二批的时候,设置监听检測何时载入第二批

2、设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener{….})

①、在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和listView被滚动时调用的方法(onScroll)

②、在滚动状态发生改变的方法中,有三种状态:

手指按下移动的状态:                          SCROLL_STATE_TOUCH_SCROLL:// 触摸滑动

惯性滚动(滑翔(flgin)状态):   SCROLL_STATE_FLING: // 滑翔

精巧状态:                                          SCROLL_STATE_IDLE:// 精巧

3、对不同的状态进行处理:

分批载入数据,仅仅关心精巧状态:关心最后一个可见的条目,假设最后一个可见条目就是数据适配器(集合)里的最后一个。此时可载入很多其它的数据。在每次载入的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候。能够提示用户无很多其它数据了。

时间: 2024-12-22 04:30:51

Android ListView 的优化的相关文章

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

Android Listview 性能优化

首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是 控件复用,从而加到减少内存的使用,使用viewHolder 的是减少findbyid 的次数. 但是在进行控件以后,在进行图片加载的时候,会出现图片错位的问题,这是因为控件里面有上次残留的图片在里面,所以我们在初始化的时候需要设置一张默认

Android ListView 全面优化

结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListView的使用进行全面的优化总结. 1. ListView 主界面 package com.panasonic.imagelight; import com.panasonic.imagelight.adapter.AsyncImageLoader; import com.panasonic.imagel

(翻译) Android ListView 性能优化指南

本文翻译了Lucas Rocha的Performance Tips for Android’s ListView.这是一篇关于介绍如何提升ListView性能的文章,非常的优秀.使得我拜读之后,忍不住将其翻译.本文采用了意译的翻译方式,尽可能的保持原文中要表达的内容.但是,任有几处翻译存在一些异议.请读者原谅.如果你对文章的内容有兴趣,请移步到我的blog,地址如下: 地址: http://kohoh1992.github.io/PerformanceTipsForAndroidListView

android listView性能优化

package com.example.ex_000_example; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.vie

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

ListView常用优化技巧(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 前言:ListView--列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大量的场合下,我们都需要使用这个控件.虽然在Android 5.X时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛,它这万年老大哥的地位也不是轻易就能撼动的.