ViewHolder的用途是什么

时间:2013-09-28 16:50:45

标签: android

我正在尝试学习Android编程。我找不到这个算法的解释:

public View getView(int r, View convertView, ViewGroup parent) {
  ViewHolder holder = null;
  // Si la vue n'est pas recyclée
  if(convertView == null) {
    // On récupère le layout
    convertView  = mInflater.inflate(R.layout.item, null);

    holder = new ViewHolder();
    // On place les widgets de notre layout dans le holder
    holder.mNom = (TextView) convertView.findViewById(R.id.nom);
    holder.mNumero = (TextView) convertView.findViewById(R.id.numero);
    holder.mPhoto = (ImageView) convertView.findViewById(R.id.photo);

    // puis on insère le holder en tant que tag dans le layout
    convertView.setTag(holder);
  } else {
    // Si on recycle la vue, on récupère son holder en tag
    holder = (ViewHolder)convertView.getTag();
  }

  // Dans tous les cas, on récupère le contact téléphonique concerné
  Contact c = (Contact)getItem(r);
  // Si cet élément existe vraiment…
  if(c != null) {
    // On place dans le holder les informations sur le contact
    holder.mNom.setText(c.getNom());
    holder.mNumero.setText(c.getNumero());
  }
  return convertView;
}
  • 为什么dos会检查convertView是否为null,如果不是?
  • 请问在这种情况下ViewHolder模式需要什么?

有人可以帮我理解吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

ListView尝试回收尚未使用的“行”视图。当您向下滚动时,某些行会从屏幕顶部消失。这些视图在convertView参数可用时传递给您的适配器,以便您可以重复使用这些视图来构建新行而不是对新行进行充气。因此,只有当传递的convertView为null时,或者换句话说,当您没有先前膨胀的视图进行回收时,您应该始终尝试对新视图进行充气。

ViewHolder模式试图避免在这些循环视图中连续调用findViewById(这是一项昂贵的操作)。每次必须生成一个新行时,不是查找所需的所有视图引用,而是仅在它被夸大之后执行一次,将这些引用存储在“ViewHolder”对象中,并将其存储为标记对于当前的观点。当该视图在回收后作为convertView返回给您时,您知道您可以只检索先前保存的ViewHolder对象,并且所有引用都将在那里。无需再次寻找它们。

答案 1 :(得分:1)

从文档引用

您的代码可能会在滚动findViewById()期间经常调用ListView,这会降低性能。即使适配器返回一个膨胀的视图以进行回收,您仍然需要查找元素并更新它们。重复使用findViewById()的方法是使用“视图持有者”设计模式。

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

更多信息

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

同时在listview上查看此视频

http://www.youtube.com/watch?v=wDBM6wVEO70

listview还会回收视图。请查看以下链接以获取更多信息

How ListView's recycling mechanism works