ViewHolder优化listview

 对于 ListView加载性能优化ViewHolder
 
 
在android的开发过程中,ListView是一个非常重要的组件,它以列表的形式柑橘数据的长自适应性展示具体内容,用户可以自定义listview的每一列的布局但是当listview有大量数据需要加载时,会占用大量的内存影响性能,这时就需要按需填充,并重新使用view来减少创建。
  
  
/**持有者的类,一般没有方法只有属性,作用是一个临时的存储器把你getView中每次返回的view存储起来,
* 用来下次使用这样做法的好处就是不必每次从你的布局文件中去拿你的view,提高了效率。
* 通常出现在适配器里,为的是listview滚动的时候快熟的设置值,而不必每次都重新创建很多对象,从而提升性能。
*/
private class ViewHolder{
public TextView tvTitle;
public TextView tvAuthor;
public TextView tvTime;
public ImageView tvImg1;
public ImageView tvImg2;
public ImageView tvImg3;
}
 
/**
* 加载listview数据
* @param position
* @param convertView 优化listview的加载速度就是让convertView匹配类型,并最大程度上重新使用convertView.
* 正确的加载方式就是当convertView不为空的时候,直接使用convertView,从而避免很多不必要view的创建,然后加载数据。
* 最快的方式是定义一个ViewHolder,将convertView的tag设置成ViewHolder。不为空时直接使用即可
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
News news=newsList.get(position);
int type=getItemViewType(position);
ViewHolder holder=null;
if(convertView==null){
holder=new ViewHolder();
switch (type){
case 0:
convertView=LayoutInflater.from(context)
.inflate(R.layout.ch04_news_item_layout, null);
holder.tvTime=(TextView)convertView.findViewById(R.id.tvTime);
holder.tvAuthor=(TextView)convertView.findViewById(R.id.tvAuthor);
break;
case 1:
convertView= LayoutInflater.from(context)
.inflate(R.layout.ch04_news_item_layout_2, null);
holder.tvImg2=(ImageView)convertView.findViewById(R.id.ivImg2);
holder.tvImg3=(ImageView)convertView.findViewById(R.id.ivImg3);
break;
}
holder.tvTitle=(TextView)convertView.findViewById(R.id.tvTitle);
holder.tvImg1=(ImageView)convertView.findViewById(R.id.ivImg);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
//绑定数据
holder.tvTitle.setText(news.getTitle());
holder.tvImg1.setImageResource(news.getImgRes()[0]);
switch (type){
case 0:
holder.tvAuthor.setText(news.getAuthor());
long timer=news.getTime();
String timeFlag="";
if(timer<1000*60*5){
timeFlag="刚刚";
}else if(timer<1000*60*60){
timeFlag="一小时之前";
}else {
Date date=new Date(new Date().getTime()-timer);
SimpleDateFormat sdf=new SimpleDateFormat("MM月dd日");
timeFlag=sdf.format(date);
}
holder.tvTime.setText(timeFlag);
break;
case 1:
holder.tvImg2.setImageResource(news.getImgRes()[1]);
holder.tvImg3.setImageResource(news.getImgRes()[2]);
break;
}
return convertView;
}
 
@Override
public int getItemViewType(int position) {
return newsList.get(position).getStyleType();
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
}


 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值