2012-07-19 49 views
8

有一个简单的问题,在搜索后我想问问为什么我们创建静态持有者类并为其分配视图?请清除我的疑惑,这对我很有帮助。适配器类中的持有者类

+0

请帮我。 – user1537629 2012-07-19 11:16:00

+0

您的问题是关于“静态”限定符,还是一般的ViewHolder?您是否阅读过文档:http://developer.android.com/training/improving-layouts/smooth-scrolling.html – 2014-03-03 20:55:51

回答

7

在滚动ListView期间,您的代码可能会频繁地调用findViewById(),这可能会降低性能。即使适配器返回回收的充气视图,您仍然需要查找元素并进行更新。围绕重复使用findViewById()的方式是使用设计模式。

A ViewHolder对象将每个组件视图存储在Layout的标签字段内,因此您可以立即访问它们而无需重复查看它们。首先,您需要创建一个类来保存一组精确的视图。

您可以阅读Android Guideline了解更多详情。

  1. 所以,当你使用“查看持有人”,那么你可以很容易地访问每个视图,而无需查找,从而节省宝贵的处理器周期。
  2. 具有对意见static inner class极大地提高了性能

你还可以看到Why does Android prefer static classes链接。

一个更有趣的链接How ListView Work,阅读这个博客开发者可以清除LisView的逻辑也是为什么需要实现内部静态类的ListView之后。

1

这是一个优化点。没有viewHolder,你需要每次调用findViewById方法。使用viewHolder,你只需要调用一次。

  • 没有ViewHolder:

    if (convertView == null) { 
        convertView = mInflater.inflate(..., null); 
    } 
    //Following called each time 
    TextView tv = (TextView)convertView.findViewById(...); 
    ImageView iv = (ImageView)convertView.findViewById(...); 
    
    tv.setText(...) 
    
  • 随着ViewHolder:

    if (convertView == null) { 
        convertView = mInflater.inflate(..., null); 
        holder = new ViewHolder(); 
        //called once 
        holder.tv = (TextView) vi.findViewById(..); 
        holder.iv = (ImageView) vi.findViewById(...); 
        vi.setTag(holder); 
    } else { 
        holder = (ViewHolder) vi.getTag(); 
    } 
    
    
    holder.tv.setText(...) 
    
2

答案也很简单,如果你

与一个TextView和ImageView的例子了解如何一个AdapterView的作品。

一个AdapterView是一个视图,其子视频由Adapter决定。 AdapterView(更具体地说是具体的实施例,如ListView)包含比任何给定时间显示的更多信息。为了优化内存消耗并且为了性能,Adapter通常重用代表单个项目的View。因此,您的对象数量少于相应的数据。

重复使用的对象可能是复杂的层次结构View s或ViewGroups。因此,如果您想要在此层次结构中找到个别对象View,则需要依赖findViewById()方法,并且当视图层次结构具有多个级别时,这会变得代价高昂。所以为了简单(也为了提高性能),我们使用View-Holder模式,我们感兴趣的单个对象被分配给一个静态内部类。

有关View-Holder模式的更多信息,请参阅Lars Vogel的Android ListView and ListActivity - Tutorial

相关问题