在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
分享到:
相关推荐
本篇将深入探讨如何通过抽取ViewHolder和优化Adapter来提升ListView的性能。 ViewHolder模式是解决ListView滚动卡顿的关键。在ListView的onCreateViewHolder和onBindViewHolder方法中,ViewHolder充当了一个缓存的...
ListView 的性能优化可以从多方面入手,包括 Adapter 的优化、视图缓存、数据加载优化等。其中,Adapter 的优化是 ListView 性能优化的关键所在。Google I/O 大会提供了多种优化 Adapter 的方案,包括使用 ...
本篇文章将深入探讨ListView的异步加载性能优化,以及如何利用ViewHolder、图片缓存和异步加载策略来提升用户体验。 首先,ViewHolder模式是ListView性能优化的基础。这个模式的主要目的是减少对视图的查找和更新...
除了ViewHolder之外,还有其他优化ListView性能的方法: 1. 使用异步加载数据:在主线程之外加载数据,避免阻塞UI。 2. 数据分页:不是一次性加载所有数据,而是按需加载。 3. 使用DiffUtil:检测数据集的变化,只...
因此,对ListView进行性能优化至关重要。本文将详细介绍几个关键的优化策略。 1. 使用ViewHolder模式 ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个...
1. **ViewHolder模式**:这是ListView性能优化的核心。通过复用已创建的视图,避免频繁的findViewById操作,减少内存分配,提升列表滑动的流畅性。在getView方法中,通过convertView参数检查并重用已存在的视图,而...
5. **性能优化**: - 使用convertView复用机制,避免频繁创建和销毁视图。 - 对大数据量列表,可以结合使用AsyncTask或者Loader进行后台加载和异步更新,防止UI线程阻塞。 - 考虑使用DiffUtil,它可以自动检测...
当我们需要在一个ListView中展示多种不同类型的item布局时,这就涉及到"ListView加载多item布局"的技术。本教程将深入探讨如何实现这一功能,并结合性能优化策略,使ListView在处理大量数据时仍能保持流畅的用户体验...
这篇博客“ListView性能优化系列之一”着重探讨了如何通过深入理解源码和利用特定工具来提升ListView的性能。 首先,了解ListView的工作原理是优化的基础。ListView采用的是滚动复用机制,即“视图回收”...
【Android应用开发中ListView组件性能优化的研究】 在Android应用开发中,ListView是常见的用于展示大量数据的组件,但在处理大量数据时,如果不进行性能优化,可能会导致应用出现卡顿、延迟甚至崩溃。本文主要探讨...
综上所述,构建一个高性能的Android ListView加载网络图片,需要结合`ViewHolder`模式、线程池(ExecutorService)、缓存管理(内存+磁盘)以及高效的网络库(如OkHttp)。这样的解决方案不仅能提升用户体验,还能...
综上所述,“listview加载图片”涉及到Android的网络编程、JSON解析、ListView适配器设计、图片加载库的使用以及性能优化等多个方面,开发者需要综合运用这些技术,实现流畅、高效的图片显示。在实际项目中,还需要...
ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的分页加载和优化显得尤为重要。以下将详细讲解ListView的分页加载机制以及相关的优化策略。 1. **分页加载原理**: 分页...
本篇文章将深入探讨ListView的基本用法,数据源的添加,以及优化性能的ViewHolder机制。 首先,ListView的基础使用主要包括以下几个步骤: 1. **布局文件**:在XML布局文件中,我们需要创建一个ListView标签,并为...
以下是对ListView加载性能优化的详细讲解: **一、最原始的加载** 这是最基本的ListView加载方式,通常会遇到的问题是频繁地创建和销毁View对象。在未经优化的Adapter中,每次调用`getView()`方法都会通过...
总结,优化ListView和实现异步加载是提升Android应用性能的关键。通过上述策略,我们可以显著改善ListView的滚动性能,减少内存消耗,同时提供更流畅的用户体验。正确理解和应用这些技术,将使你的Android应用更具...
4. 性能优化: - 数据缓存:为了减少网络请求,可以将已加载的数据存储在SQLite数据库或Room库中,下次加载时优先从本地获取。 - LoadState:Paging 3库提供了LoadState接口,可以显示加载状态(如加载中、无更多...
然而,开发者在实现ListView加载图片时可能会遇到图片错乱或错位的问题,这通常是由于不当的图片加载策略或者ListView的复用机制导致的。本篇文章将深入探讨这个问题,并提供解决方案。 一、ListView图片错乱的原因...
总结,处理ListView加载不同布局时,我们需要理解ListView的视图复用机制,自定义Adapter并实现`getView()`方法,正确处理不同类型的视图,避免`ClassCastException`异常。同时,使用ViewHolder模式和类型安全的强转...
在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。