我知道回收视图是新的,但我想知道列表视图中2个代码的区别。我已经尝试过搜索很多但没有得到具体答案。我知道第一个比第二个更快,因为内存消耗,但为什么第二个代码比第一个慢,内部过程是什么,任何人都可以使用它。
这是第一个代码
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final HashMap<String ,String > item = lst.get(position);
ViewHolderItem viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false);
viewHolder = new ViewHolderItem();
viewHolder.title = (TextView)convertView.findViewById(R.id.item_name);
viewHolder.msg = (TextView)convertView.findViewById(R.id.message);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolderItem) convertView.getTag();
}
viewHolder.title.setText(item.get(Const.USERNAME));
viewHolder.msg.setText(item.get(Const.GET_MESSAGE));
return convertView;
}
这是第二个代码
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final HashMap<String ,String > item = lst.get(position);
ViewHolderItem viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false);
viewHolder = new ViewHolderItem();
viewHolder.title = (TextView)convertView.findViewById(R.id.item_name);
viewHolder.msg = (TextView)convertView.findViewById(R.id.message);
}
viewHolder.title.setText(item.get(Const.USERNAME));
viewHolder.msg.setText(item.get(Const.GET_MESSAGE));
return convertView;
}
答案 0 :(得分:0)
如果视图刚刚膨胀,则第二个示例缺少关于将viewHolder
保存为已创建视图的标记的部分,如果视图已存在则重复使用viewHolder
。
答案 1 :(得分:0)
列表视图项目可以随时重新创建。 (当您向上和向下滚动时会发生这种情况)。每当ListView
需要重新创建一个项目时,它会调用具有所需位置的适配器的getView()
。在getView()
方法中,您可以生成该位置所需的项View
。
用于在XML中查找findViewById()
的方法View
是CPU广泛的。如果您的XML包含很长的子序列且getView()
包含大量findViewById()
次调用,您可能会看到相当滞后。
这是ViewHolder的便利之处。 ViewHolder是一个可以保存View项的类。您可以使用已创建的ViewHolder对象,而不是每次都调用findViewById()
。
要使用此功能,您必须保存与特定位置关联的ViewHolder对象。你是这样做的。
ViewHolder viewHolder;
if(convertView==null){
//the view is created for the first time
//you have to make the View HOlder object here
viewHOlder=new ViewHOlder(convertView);
//ViewHOlder constructor can find the required view elements and store it in variables
//now you have to save this View Holder object for future reference
//you save it as a tag
convertView.setTag(viewHolder);
}
现在您已为特定项目位置定义了视图持有者。以下是如何重新使用它。
当ListView
适配器无法重新使用它时,convertView
的{{1}}不为空。因此,重复使用发生在上述getItem()
的{{1}}语句中。
else
在第二个示例中,您创建了ViewHOlder,但您永远不会再使用它。所以它没有改善。