基于“ViewHolder”技术提升Android ListView中Item View加载效率

对于提升Android中频繁使用的ListView子Item View的加载效率,基于两点基本考虑:

1,Android的View的创建比较消耗资源;

2,findViewById()也不是最快的。

所以在实际开发中经常使用的适配器中的getView()方法:

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

如果每次都在里面创建一个新View出来,将导致效率低下,比较高效率的做法是每次判断convertView是否为空,若不为空,则直接使用convertView的findViewById()把子View重建出来即可。

但是,这种做法虽然提升了效率,但仍不是最高效的做法,因为还是使用了findViewById()。

因此,进一步的效率提升改进之处是:使用一种称为“ViewHolder”的技术,缓存convertView中的View组件,使用convertView的setTag()和getTag(),每次当ListView需要创建Item的View时候,调用convertView的getTag()找出ViewHolder,重新复用。具体的使用方法如代码所示:

package zhangphil.listview;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ListActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		ListView lv = this.getListView();
		setContentView(lv);

		ArrayAdapter adapter = new MyAdapter(this,
				android.R.layout.simple_list_item_2);
		lv.setAdapter(adapter);
	}

	private class MyAdapter extends ArrayAdapter {

		private int resId;
		private LayoutInflater mInflater;
		private	ViewHolder holder = null; 

		public MyAdapter(Context context, int resource) {
			super(context, resource);
			this.resId = resource;
			mInflater = LayoutInflater.from(context);
		}

		//子View的“容器”
		public final class ViewHolder {
			public TextView text1;
			public TextView text2;
		}

		@Override
		public int getCount() {
			//巨大的数据
			return 10000;
		}

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

			if (convertView == null) {
				convertView = mInflater.inflate(resId, null);

				holder = new ViewHolder();  

				holder.text1=(TextView) convertView.findViewById(android.R.id.text1);
				holder.text2=(TextView) convertView.findViewById(android.R.id.text2);

				convertView.setTag(holder);
			}
			else
				holder=(ViewHolder) convertView.getTag();

			holder.text1.setText("text1:"+position);
			holder.text2.setText("text2:"+position);

			return convertView;
		}
	}
}



时间: 2024-08-09 19:23:17

基于“ViewHolder”技术提升Android ListView中Item View加载效率的相关文章

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**

优化ListView中的网络图片加载 及 Volley库源码分析

使用适当的开源库,如Volley或者Universal ImageLoader 以Volley库为例.Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程. 主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题.如下图: 其中左下角是NetworkDispatcher线程,大致步骤是: 1.不断从请求队列中取出请求 request = mQueue.take(); 2.发起网络请求 NetworkResp

listview中getview异步加载网络图片

前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点大,讲起来也不太好讲,我尽力讲的明白些,其实还是要多看代码,自己摸索摸索,动手写写就什么都理解了.这篇我们只讲怎样实现异步加载,对于滑动时停止加载的事下篇再讲. 实现效果: 1.异步加载图片,在加载图片时,先加载一个默认的图片,然后在后台加载图片,加载完成后显示出来: 2.当用户在滑动时,停止加载图

Android: ListView数据的分批加载 以及 Handle 总结

这是效果图: activity_main.xml 01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 02     xmlns:tools="http://schemas.android.com/tools" 03     android:layout_width="match_parent" 04     android:layout_he

android Listview下滑,自动加载数据.修改多处地方,去除重绘listvew,防止闪烁

感谢其他大神的的源码支持 我仅在此源码上进行修改以及注释. 使用方法: //设置加载分页数据监听 loadingListView.setOnLoadMoreListener(new OnLoadMoreListener() { public void onLoadMore() { if(page<3){ }else{ loadingListView.onLoadMoreComplete();//移除加载更多布局,加载完成 loadingListView.setIsEnable(false); /

【Android进阶】关于ListView中item与控件抢夺焦点的那些事

在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者是CheckBox等控件以及其子类控件的时候,经常会碰到各种控件的点击事件冲突的情况,那么我们如何来处理Listview中这种控件之间焦点冲突的情况呢? 我们以item存在一个Button控件为例 首先,加入我们不设置任何关于焦点的属性,比如focus等,代码如下 @Override public

浅谈Android中的异步加载之ListView中图片的缓存及优化三

     隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算有点价值的就是里面的图片的缓存的实现.因为老实说它确实能在实际的项目中得到很好的应用.主要学习来源于慕课网中的异步加载学习,来自徐宜生大神的灵感.本次也就是对大神所讲知识的一个总结及一些个人的感受吧. 这次是一个综合的Demo,主要里面涉及到的知识主要有:网络编程.异步加载.JSON解析.

改变listview中item选中时文字的颜色

当listview的某个item选中时,默认有个选中的高亮显示,如果你要自定义选中时的高亮显示效果,可以在listview中设置属性 1 android:listSelector="@drawable/item_selector" 其中item_selector是在drawable目录下定义的一个xml文件,这种用于突出不同状态下显示效果的xml文件我们称之为selector: 1 2 3 4 5 6 7 <?xml version="1.0" encodin

提升Android ListView性能的几个技巧

ListView如何运作的? ListView是设计应用于对可扩展性和高性能要求的地方.实际上,这就意味着ListView有以下2个要求: 尽可能少的创建View: 只是绘制和布局在屏幕上可见的子View. 理解第一点很简单:通过布局xml文件在创建View并显示是很昂贵耗时耗资源的操作.尽管布局文件已经编译打包成了二进制形式以便于更高效的语法解析,但是创建View仍然需要通过一个特殊的XML树,并实例化所有需要响应的View. ListView通过回收一些不可见的Views,通常在Androi