• 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中自定义样式的文章

  • 相关阅读:
    UML中的构件图
    Extjs4 中的gird
    【转载】C#实现线程安全的网络流
    [转载]组播
    【转载】wcf综合运用之:大文件异步断点续传
    【转载】WCF热门问题编程示例(4):WCF客户端如何异步调用WCF服务?
    【转载】特殊用途的IP地址介绍
    [转载]C# HashTable
    c宏定义实战
    c异或加密与解密
  • 原文地址:https://www.cnblogs.com/hejiaoshou/p/7471309.html
Copyright © 2020-2023  润新知