Android开发中常用的ListView列表的优化方式ViewHolder
在Android开发中难免会遇到大量的数据加载到ListView中进行显示,
然后其中最重要的数据传递桥梁Adapter适配器是常用的,随着市场的需
求变化ListView'条目中的内容是越来越多这就需要程序员来自定义适配器,
而关键的就是适配器的优化问题,适配器没有优化好往往就会造成OOM
(内存溢出)或者是滑动卡顿之类的问题,接下来我就给大家介绍一种常
用的Adapter优化方法
1 /** 2 * list View的适配器 3 */ 4 class Adapter extends BaseAdapter { 5 6 /** 7 * 返回item条目总数 8 * 9 * @return 10 */ 11 @Override 12 public int getCount() { 13 return newsInfos.size(); 14 } 15 16 /** 17 * 次方法返回的是Object类型的,可以返回任意类型的数据 18 * 我这里返回的是一个java ben集合中的一个ben对象 19 * 20 * @param position 21 * @return 22 */ 23 @Override 24 public Object getItem(int position) { 25 return newsInfos.get(position); 26 } 27 28 /** 29 * 返回item所在的位置,从0开始计数的 30 * 31 * @param position 32 * @return 33 */ 34 @Override 35 public long getItemId(int position) { 36 return position; 37 } 38 39 /** 40 * 定义一个ViewHolder对象 41 */ 42 ViewHolder holder; 43 44 /** 45 * 此方法返回一个item的View 46 * 47 * @param position listView中item的位置 48 * @param convertView 这个convertView其实就是最关键的部分 原理上讲 当ListView滑动的过程中 会有item被滑出屏幕 而不再被使用 这时候Android会回收这个条目的view 这个view也就是这里的convertView 49 * 当item1被移除屏幕的时候 我们会重新new一个View给新显示的item_new 而如果使用了这个convertView 我们其实可以复用它 这样就省去了new View的大量开销 50 * @param parent parent是item的view的父视图,调整item宽高用的 不常用 51 * @return 52 */ 53 @Override 54 public View getView(int position, View convertView, ViewGroup parent) { 55 56 if (convertView == null) { 57 convertView = View.inflate(HomeActivity.this, R.layout.list_item, null); 58 } 59 60 //先都与优化没多大关系了都是设置每个控件的数据 61 holder = getHolder(convertView); 62 holder.com.setText(newsInfos.get(position).getComment() + "次浏览"); 63 holder.type.setText(getType(newsInfos.get(position).getType())); 64 holder.time.setText(newsInfos.get(position).getTime()); 65 holder.desc.setText(newsInfos.get(position).getDescription()); 66 holder.title.setText(newsInfos.get(position).getTitle()); 67 String timeId = newsInfos.get(position).getId(); 68 String stats = SharePrefenceUtils 69 .getInstance(HomeActivity.this).getStr("new_item" + timeId, ""); 70 if (TextUtils.equals(timeId, stats)) { 71 holder.stats.setText("已读"); 72 holder.stats.setSelected(true); 73 } else { 74 holder.stats.setText("未读"); 75 holder.stats.setSelected(false); 76 } 77 holder.icon.setImageUrl(newsInfos.get(position).getImage(), null); 78 return convertView; 79 } 80 81 /** 82 * 得到ViewHolder 83 * 84 * @param view 85 * @return 86 */ 87 public ViewHolder getHolder(View view) { 88 //通过传递进来的view 的getTag方法获得holder 89 ViewHolder holder = (ViewHolder) view.getTag(); 90 if (holder == null) { 91 //如果传递进来的View没有设置Tag,就重新new一个holder实例 92 holder = new ViewHolder(view); 93 //给传递进来的view设置tag 94 view.setTag(holder); 95 } 96 //返回holder 97 return holder; 98 } 99 100 /** 101 * 定义一个ViewHolder类 102 */ 103 class ViewHolder { 104 //下面定义的属性控件都是listView中item里有的控件 105 TextView title; 106 TextView desc; 107 TextView time; 108 TextView type; 109 TextView com; 110 TextView stats; 111 SmartImageView icon; 112 113 /** 114 * 创建该类的实例时需要传入item的view 115 * 来得到item中各个控件的实例 116 * 117 * @param view 118 */ 119 public ViewHolder(View view) { 120 title = (TextView) view.findViewById(R.id.tv_title); 121 icon = (SmartImageView) view.findViewById(R.id.iv_icon); 122 desc = (TextView) view.findViewById(R.id.tv_desc); 123 time = (TextView) view.findViewById(R.id.tv_time); 124 type = (TextView) view.findViewById(R.id.tv_type); 125 com = (TextView) view.findViewById(R.id.tv_com); 126 stats = (TextView) view.findViewById(R.id.tv_stats); 127 } 128 } 129 }
最后给大家瞧瞧我实现的效果图把,如果有对item样式感兴趣的朋友们请在下方留言我会再写一篇关于android中自定义样式的文章