1

我正在尝试学习 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;
}
  • 为什么作者检查 convertView 是否为空,如果不是?
  • 请问在这种情况下 ViewHolder 模式需要什么?

有人可以帮我理解吗?

提前致谢。

4

2 回答 2

4

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

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

于 2013-09-28T17:07:20.027 回答
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 还回收视图。检查以下链接以获取更多信息

ListView 的回收机制是如何工作的

于 2013-09-28T16:58:18.913 回答