Android adaptor开发教程
最近使用ListView、GridView等需要搭配Adaptor完成的代码时,总是出现莫名奇怪的问题,主要归结于两点,一是性能的优化,二是Google提供的listview缓冲技术的使用不当。关于性能优化,以ListView为例。通常只有在继承BaseAdaptor重写适配器时才涉及优化问题,而主要的优化步骤,放在getView方法中实现。

程序代码清单如下:
|
class DisplayAdapter extends BaseAdapter { private View[] mItem; private String[] mHairFilePath; private LayoutInflater mInflater;
private HashMap public DisplayAdapter(Context context) { if (context == null) { return; } mInflater = LayoutInflater.from(context); File hairDir = new File(M7Commen.SDCARD + "/sundyn/hair"); if (hairDir.exists() && hairDir.isDirectory()) { String[] hairFileName = hairDir.list(); mHairFilePath = new String[hairFileName.length]; mItem = new View[hairFileName.length]; for (int i = 0; i < hairFileName.length; i++) { mHairFilePath[i] = M7Commen.SDCARD + "/sundyn/hair/" + hairFileName[i]; } }
mMap = new HashMap } public int getCount() { if (mHairFilePath != null) { return mHairFilePath.length; } return 0; } public Object getItem(int position) { return mItem[position]; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.display_item, null); holder = new ViewHolder(); holder.iv = (ImageView) convertView.findViewById(R.id.idDisplayPic); Bitmap bmp = M7Commen.getLoacalBitmap(mHairFilePath[position], true, 204);
WeakReference if (bmp != null) {
weakBmp = new WeakReference holder.iv.setImageBitmap(bmp); mMap.put(position, weakBmp); } convertView.setTag(holder); mItem[position] = convertView; } else { holder = (ViewHolder) convertView.getTag();
WeakReference if (weakBmp == null || weakBmp.get() == null) { Bitmap bmp = M7Commen.getLoacalBitmap(mHairFilePath[position], true, 204); if (bmp != null) {
weakBmp = new WeakReference holder.iv.setImageBitmap(bmp); mMap.put(position, weakBmp); } } holder.iv.setImageBitmap(weakBmp.get()); } return convertView; } public static class ViewHolder { public ImageView iv; } } |
优化的关键在于,使用自定义的ViewHolder类来存储构造过的对象,以及使用弱引用构造的HashMap来存储加载过的图片资源。
需要注意的是,getView方法中的convertView参数,指的是刚刚消失在屏幕显示范围内的条目,如果不进行数据更新而直接返回的话,容易引起数据混乱。contentView的意义在于,如果不为null,通过事先setTag()方法绑定的ViewHolder对象可以通过getTag()还原,从而省去了再次创建或转化控件的步骤,提高了程序执行效率。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/504.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
