优化后的getView():
@Override
public View getView(intposition, View convertView, ViewGroup paramViewGroup) {
Object object = mObjects.get(position);
ViewHolder holder =null;if(convertView ==null) {
holder =newViewHolder();
convertView = inflater.inflate(R.layout.row_event,null);
holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);
holder.EventPoster = (ImageView) convertView.findViewById(R.id.EventPoster);
//设置参数提到这里,只有第一次的时候会执行,之后会复用
RelativeLayout.LayoutParams imageParams =newRelativeLayout.LayoutParams(measuredwidth, rowHeight);
holder.EventPoster.setLayoutParams(imageParams);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}// 我们直接通过对象的getter方法代替刚才那些逻辑判断,那些逻辑判断放到别的地方去执行了holder.ThreeDimension.setVisibility(object.getVisibility());returnconvertView;
}
2.GC 垃圾回收器
当你创建了大量的对象的时候,GC就会频繁的执行,所以在getView()方法中不要创建很多的对象,最好的优化是,不要在ViewHolder以外创建任何对象,如果你的你的log里面发现“GC has freed some memory”频繁出现的话,那你的程序肯定有问题了。你可以检查一下:
a) item布局的层级是否太深
b) getView()方法中是否有大量对象存在
c) ListView的布局属性
3.加载图片
如果你的ListView中需要显示从网络上下载的图片的话,我们不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要再监听器里面监听ListView的状态,如果滑动的时候,停止加载图片,如果没有滑动,则开始加载图片
listView.setOnScrollListener(newOnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView listView,intscrollState) {
//停止加载图片
if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
imageLoader.stopProcessingQueue();
}else{
//开始加载图片
imageLoader.startProcessingQueue();
}
}
@Override
public void onScroll(AbsListView view,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount) {
// TODO Auto-generated method stub}
});










