我正在尝试学习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;
}
有人可以帮我理解吗?
提前致谢。
答案 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还会回收视图。请查看以下链接以获取更多信息