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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中自定义样式的文章

技术分享

以上是关于Android开发中常用的ListView列表的优化方式ViewHolder的主要内容,如果未能解决你的问题,请参考以下文章

Android最常用的控件ListView(详解)

android 开发 listview绑定radiobutton控件 如何实现listview列表中只有一个radiobutton被选中?

Android listview局部刷新和模拟应用下载(zhu)

android开发:列表listview的实现 | 下拉刷新

ListView常用属性及设置点击事件

Android移动应用开发之使用ListView+SQLiteOpenHelper实现商品列表添加删除的界面