Android开发中常用的ListView列表的优化方式ViewHolder

  在Android开发中难免会遇到大量的数据加载到ListView中进行显示,

然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需

求变化ListView'条目中的内容是越来越多这就需要程序员来自定义适配器,

而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM

(内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常

用的Adapter优化方法

   /**
* list View的适配器
*/
class Adapter extends BaseAdapter { /**
* 返回item条目总数
*
* @return
*/
@Override
public int getCount() {
return newsInfos.size();
} /**
* 次方法返回的是Object类型的,可以返回任意类型的数据
* 我这里返回的是一个java ben集合中的一个ben对象
*
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return newsInfos.get(position);
} /**
* 返回item所在的位置,从0开始计数的
*
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position;
} /**
* 定义一个ViewHolder对象
*/
ViewHolder holder; /**
* 此方法返回一个item的View
*
* @param position listView中item的位置
* @param convertView 这个convertView其实就是最关键的部分 原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 这时候Android会回收这个条目的view 这个view也就是这里的convertView
* 当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new 而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销
* @param parent parent是item的view的父视图,调整item宽高用的 不常用
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
convertView = View.inflate(HomeActivity.this, R.layout.list_item, null);
} //先都与优化没多大关系了都是设置每个控件的数据
holder = getHolder(convertView);
holder.com.setText(newsInfos.get(position).getComment() + "次浏览");
holder.type.setText(getType(newsInfos.get(position).getType()));
holder.time.setText(newsInfos.get(position).getTime());
holder.desc.setText(newsInfos.get(position).getDescription());
holder.title.setText(newsInfos.get(position).getTitle());
String timeId = newsInfos.get(position).getId();
String stats = SharePrefenceUtils
.getInstance(HomeActivity.this).getStr("new_item" + timeId, "");
if (TextUtils.equals(timeId, stats)) {
holder.stats.setText("已读");
holder.stats.setSelected(true);
} else {
holder.stats.setText("未读");
holder.stats.setSelected(false);
}
holder.icon.setImageUrl(newsInfos.get(position).getImage(), null);
return convertView;
} /**
* 得到ViewHolder
*
* @param view
* @return
*/
public ViewHolder getHolder(View view) {
//通过传递进来的view 的getTag方法获得holder
ViewHolder holder = (ViewHolder) view.getTag();
if (holder == null) {
//如果传递进来的View没有设置Tag,就重新new一个holder实例
holder = new ViewHolder(view);
//给传递进来的view设置tag
view.setTag(holder);
}
//返回holder
return holder;
} /**
* 定义一个ViewHolder类
*/
class ViewHolder {
//下面定义的属性控件都是listView中item里有的控件
TextView title;
TextView desc;
TextView time;
TextView type;
TextView com;
TextView stats;
SmartImageView icon; /**
* 创建该类的实例时需要传入item的view
* 来得到item中各个控件的实例
*
* @param view
*/
public ViewHolder(View view) {
title = (TextView) view.findViewById(R.id.tv_title);
icon = (SmartImageView) view.findViewById(R.id.iv_icon);
desc = (TextView) view.findViewById(R.id.tv_desc);
time = (TextView) view.findViewById(R.id.tv_time);
type = (TextView) view.findViewById(R.id.tv_type);
com = (TextView) view.findViewById(R.id.tv_com);
stats = (TextView) view.findViewById(R.id.tv_stats);
}
}
}

最后给大家瞧瞧我实现的效果图把,如果有对item样式感兴趣的朋友们请在下方留言我会再写一篇关于android中自定义样式的文章

Android开发中常用的ListView列表的优化方式ViewHolder

上一篇:listview优化 汇总


下一篇:内存泄露--contentView缓存使用与ListView优化