您的位置:首页 > 产品设计 > UI/UE

Android UI基础——ListView性能优化ViewHolder

2016-04-24 20:44 501 查看
其实上一篇文章中我们ListView的运行效率非常低,因为在Adapter中的getView()方法中每次都会将布局加载一遍,当ListView的item很多的时候,想要完成快速滚动是不可能的,所以可以借助一个ViewHodler进行性能的优化。

这部分代码是在Adapter中实现的,新建一个内部类ViewHolder,用于控件的缓存,当convertView为空时,创建一个ViewHolder的对象,将所有控件放入ViewHolder中,然后调用setTag(),将ViewHolder对象放在View中,如果convertView不为空,调用getTag()方法,从View中把ViewHolder对象取出来,这样实际的效果是只有第一次进入页面可看见的ListView的item是新建的,其他往下滑动出现的item都是取之前的,具体代码如下:

public class SportListAdapter extends BaseAdapter{
private List<SportsNews> list;//此处的泛型是我自己定义的一个类,提供了三个属性
private Context mContext;

public SportListAdapter(List<SportsNews> list, Context mContext) {
this.list = list;
this.mContext = mContext;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
/**
* ViewHolder性能优化写法
*/
ViewHolder holder;//初始化MyViewHolder
if (convertView == null){
holder = new ViewHolder();//实例化对象
convertView = LayoutInflater.from(mContext).inflate(R.layout.sport_list_item,null);//自定义设置布局
holder.mImageView = (ImageView) convertView.findViewById(R.id.sport_list_image);//给布局中的控件绑定id
holder.mTextView_1 = (TextView) convertView.findViewById(R.id.sport_list_text_1);
holder.mTextView_2 = (TextView) convertView.findViewById(R.id.sport_list_text_2);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
SportsNews sportsNews = list.get(position);
holder.mImageView.setImageResource(sportsNews.getPhoto());
holder.mTextView_1.setText(sportsNews.getTitle());
holder.mTextView_2.setText(sportsNews.getContent());
return  convertView;
}
//内部类ViewHolder
class ViewHolder{
ImageView mImageView;
TextView mTextView_1;
TextView mTextView_2;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息