`
Tony_Lee-S
  • 浏览: 82505 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

listview加载性能优化ViewHolder (转)

阅读更多
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。

ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。

getview的加载方法一般有以下三种种方式:

最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据

public View getView(int position, View convertView, ViewGroup parent) {

View item = mInflater.inflate(R.layout.list_item_icon_text, null);

((TextView) item.findViewById(R.id.text)).setText(DATA[position]);

((ImageView) item.findViewById(R.id.icon)).setImageBitmap(

(position & 1) == 1 ? mIcon1 : mIcon2);

return item;

}



正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = mInflater.inflate(R.layout.item, parent, false);

}

((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);

((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(

(position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}



最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

static class ViewHolder {

TextView text;

ImageView icon;

}



public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;



if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item_icon_text,

parent, false);

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}



三种方式加载效率对比如下图所示:

说明:上述三个例子代码摘自google 2010 I/O大会



当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:

1.   适配器在界面主线程中进行修改

2.   可以在任何地方获取数据但应该在另外一个地方请求数据

3.   在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法
转自:
http://blog.csdn.net/jacman/article/details/7087995
分享到:
评论

相关推荐

    ListView的优化使用-抽取ViewHolder以及adapter类

    本篇将深入探讨如何通过抽取ViewHolder和优化Adapter来提升ListView的性能。 ViewHolder模式是解决ListView滚动卡顿的关键。在ListView的onCreateViewHolder和onBindViewHolder方法中,ViewHolder充当了一个缓存的...

    ListView性能优化之视图缓存

    ListView 的性能优化可以从多方面入手,包括 Adapter 的优化、视图缓存、数据加载优化等。其中,Adapter 的优化是 ListView 性能优化的关键所在。Google I/O 大会提供了多种优化 Adapter 的方案,包括使用 ...

    Listview的异步加载性能优化

    本篇文章将深入探讨ListView的异步加载性能优化,以及如何利用ViewHolder、图片缓存和异步加载策略来提升用户体验。 首先,ViewHolder模式是ListView性能优化的基础。这个模式的主要目的是减少对视图的查找和更新...

    ListViewAdapter和ViewHolder代码,安卓listview适配器.rar

    除了ViewHolder之外,还有其他优化ListView性能的方法: 1. 使用异步加载数据:在主线程之外加载数据,避免阻塞UI。 2. 数据分页:不是一次性加载所有数据,而是按需加载。 3. 使用DiffUtil:检测数据集的变化,只...

    Android ListView性能优化

    因此,对ListView进行性能优化至关重要。本文将详细介绍几个关键的优化策略。 1. 使用ViewHolder模式 ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个...

    listview高级部分,性能优化的demo

    1. **ViewHolder模式**:这是ListView性能优化的核心。通过复用已创建的视图,避免频繁的findViewById操作,减少内存分配,提升列表滑动的流畅性。在getView方法中,通过convertView参数检查并重用已存在的视图,而...

    万能listView ViewHolder适配器

    5. **性能优化**: - 使用convertView复用机制,避免频繁创建和销毁视图。 - 对大数据量列表,可以结合使用AsyncTask或者Loader进行后台加载和异步更新,防止UI线程阻塞。 - 考虑使用DiffUtil,它可以自动检测...

    ListView加载多item布局

    当我们需要在一个ListView中展示多种不同类型的item布局时,这就涉及到"ListView加载多item布局"的技术。本教程将深入探讨如何实现这一功能,并结合性能优化策略,使ListView在处理大量数据时仍能保持流畅的用户体验...

    ListView性能优化系列之一

    这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...

    Android应用开发中ListView组件性能优化的研究.pdf

    【Android应用开发中ListView组件性能优化的研究】 在Android应用开发中,ListView是常见的用于展示大量数据的组件,但在处理大量数据时,如果不进行性能优化,可能会导致应用出现卡顿、延迟甚至崩溃。本文主要探讨...

    android listview 加载网络图片(线程池+缓存管理) 高性能

    综上所述,构建一个高性能的Android ListView加载网络图片,需要结合`ViewHolder`模式、线程池(ExecutorService)、缓存管理(内存+磁盘)以及高效的网络库(如OkHttp)。这样的解决方案不仅能提升用户体验,还能...

    listview加载图片

    综上所述,“listview加载图片”涉及到Android的网络编程、JSON解析、ListView适配器设计、图片加载库的使用以及性能优化等多个方面,开发者需要综合运用这些技术,实现流畅、高效的图片显示。在实际项目中,还需要...

    listview 分页加载,优化

    ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的分页加载和优化显得尤为重要。以下将详细讲解ListView的分页加载机制以及相关的优化策略。 1. **分页加载原理**: 分页...

    android_listView组件的使用_添加viewHolder机制

    本篇文章将深入探讨ListView的基本用法,数据源的添加,以及优化性能的ViewHolder机制。 首先,ListView的基础使用主要包括以下几个步骤: 1. **布局文件**:在XML布局文件中,我们需要创建一个ListView标签,并为...

    Listview加载的性能优化是如何实现的

    以下是对ListView加载性能优化的详细讲解: **一、最原始的加载** 这是最基本的ListView加载方式,通常会遇到的问题是频繁地创建和销毁View对象。在未经优化的Adapter中,每次调用`getView()`方法都会通过...

    listview优化和异步加载全攻略

    总结,优化ListView和实现异步加载是提升Android应用性能的关键。通过上述策略,我们可以显著改善ListView的滚动性能,减少内存消耗,同时提供更流畅的用户体验。正确理解和应用这些技术,将使你的Android应用更具...

    android listView 分页加载

    4. 性能优化: - 数据缓存:为了减少网络请求,可以将已加载的数据存储在SQLite数据库或Room库中,下次加载时优先从本地获取。 - LoadState:Paging 3库提供了LoadState接口,可以显示加载状态(如加载中、无更多...

    android listview 加载图片错乱(错位)

    然而,开发者在实现ListView加载图片时可能会遇到图片错乱或错位的问题,这通常是由于不当的图片加载策略或者ListView的复用机制导致的。本篇文章将深入探讨这个问题,并提供解决方案。 一、ListView图片错乱的原因...

    Android ListView加载不同布局.解决异常ClassCastException

    总结,处理ListView加载不同布局时,我们需要理解ListView的视图复用机制,自定义Adapter并实现`getView()`方法,正确处理不同类型的视图,避免`ClassCastException`异常。同时,使用ViewHolder模式和类型安全的强转...

    listview实现动态加载

    在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。

Global site tag (gtag.js) - Google Analytics