ViewHolder优化ListView

在Android开发中, ListView是重要的组件, 它以列表形式根据数据的长度, 自适应展示具体内容. 用户可以自由的定义ListView每一列的布局. 当listview有大量数据需要加载的时候, 会占据内存, 影响性能. 这时候就需要按需填充, 并重新使用View, 减少对象的创建. ListView加载数据都是在getView()方法中进行. 同时, 需要自定义ListView重写ListAdapter: 如BaseAdapter, SimpleAdapter, CursorAdapter等. 优化ListView加载速度, 要让convertView匹配列表类型, 并最大程度的重用convertView.

getView()的加载方法一般有以下三种方式: (1) 最慢的加载方式: 每次都重新定义一个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;}

(2) 较快的加载方式: 当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;}

(3) 最快的较方式: 定义一个ViewHolder,将convetView的tag设置为ViewHolder, 不为空时重用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;}

三种方式的效率对比:

当处理一些耗时的资源加载时, 做到以下几点, 可使你的加载更快更平滑: (1) 适配器在界面主线程中进行修改 (2) 可以在任何地方获取数据但应该在另外一个地方请求数据 (3) 在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法(更新数据源)

,希望有一天,自己也像他们一样,踩着单车上路,

ViewHolder优化ListView

相关文章:

你感兴趣的文章:

标签云: