当listview显示的数据过多,会严重影响性能。这里主要使用的优化方法,就是优化数据适配器(Adapter)的getView方法。尽量减少显示一次数据,重新加载一次布局。
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 模式, 效率提高 50%
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.listview_item, 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("数据"); holder.icon.setImageBitmap(bitmap); return convertView; }
参考:http://blog.csdn.net/xiaodongvtion/article/details/7918741