标签:
ListView的使用遵循MVC模式,m是实体,v是视图(即为ListView),C是控制器(即未适配器adapter)
使用ListView一般可以遵循以下步骤
一、定义一个ListView展示的条目的布局
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/iv_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="20sp" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:text="测试应用" /> </RelativeLayout>
二、定义一个数据实体(javabean)
package com.jsako.listviewdemo.domain; import android.graphics.drawable.Drawable; public class AppInfo { private String appName; private Drawable appIcon; @Override public String toString() { return "AppInfo [appName=" + appName + ", appIcon=" + appIcon + "]"; } public String getAppName() { return appName; } public void setAppName(String appName) { this.appName = appName; } public Drawable getAppIcon() { return appIcon; } public void setAppIcon(Drawable appIcon) { this.appIcon = appIcon; } }
三、初始化数据(准备好需要展示的数据,可以读取数据库获取,可以通过网络下载获取)
private List<AppInfo> appInfos=new ArrayList<AppInfo>();
private void initAppInfos() { List<ApplicationInfo> infos=pm.getInstalledApplications(0); AppInfo appInfo; for(ApplicationInfo info:infos){ appInfo=new AppInfo(); appInfo.setAppIcon(info.loadIcon(pm)); appInfo.setAppName(info.loadLabel(pm).toString()); appInfos.add(appInfo); } }
四、定义一个适配器内部类
private class MyAdapter extends BaseAdapter{ @Override public int getCount() { return appInfos.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; if(convertView!=null){ view=convertView; holder=(ViewHolder) view.getTag(); }else{ view=View.inflate(getApplicationContext(), R.layout.list_item, null); holder=new ViewHolder(); holder.iv_icon=(ImageView) view.findViewById(R.id.iv_icon); holder.tv_text=(TextView) view.findViewById(R.id.tv_text); view.setTag(holder); } holder.iv_icon.setImageDrawable(appInfos.get(position).getAppIcon()); holder.tv_text.setText(appInfos.get(position).getAppName()); return view; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } class ViewHolder{ ImageView iv_icon; TextView tv_text; } }
五、找到ListView的对象,然后设置适配器
lv=(ListView) findViewById(R.id.lv_show); lv.setAdapter(new MyAdapter());
以上就是ListView的基本使用方法,下面我们来谈谈提升ListView的效率
1、在MyAdapter里的getView方法中,ListView没显示一条条目都会调用该方法一次,里面有个参数是convertView,这个参数用于将之前加载好的布局进行缓存,以便以后进行重用
所以我们可以对convertView进行判断,判断它是否为null,如果不为null则复用它,如果为null则通过View.inflate()方法加载一个布局view对象。这样就可减少对内存的开销,复用以前的缓存,提升效率。
2、再则新增了一个内部类ViewHolder,用于对每个小条目里的控件的实例进行缓存。然后当convertView为null的时候将ViewHolder的实例通过view.setTag()保存起来,在convert不为空的时候将ViewHolder的实例通过view.getTag()取出,
然后设置对应的值。这样就能避免ListView每次调用getView的时候都调用view.findViewById(),这个方法非常耗时,降低性能。采取ViewHolder内部类的这种方法能提升效率。
Android中ListView的使用以及提升ListView的运行效率
标签:
原文地址:http://www.cnblogs.com/Jsako/p/5653862.html