这正是你所说的一种回收形式。
膨胀的布局需要大量的内存和大量的时间,所以为了提高效率,系统会传递给你刚刚离开屏幕的内容,并且你可以简单地更新它的文本和图像并将它们返回给UI。因此,例如,如果您的列表视图在其列表中显示6个项目(由于它的高度),它将只膨胀6个项目,并且在滚动期间它只是继续回收它们。
有一些额外的优化技巧,你应该使用,我敢肯定,评论者发布的视频链接将解释他们。
编辑
这个例子是商店物品的ArrayAdapter,但你可以把它到任何你所需要的。 适配器执行UI和数据之间的匹配和分隔层。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = newView();
// Store is the type of this ArrayAdapter
Store store = getItem(position);
Holder h = (Holder) convertView.getTag();
// And here I get the data and address them to the UI
// as you can see, if the convertView is not null,
// I'm not creating a new one, I'm just changing text, images, etc
h.storeName.setText(store.getStoreName());
h.address.setText(store.getAddressLine1());
h.postcode.setText(store.getPostCode());
h.distance.setText(store.getDistance());
return convertView;
}
// I like to separate in a different method when the convertView is null
// but that's me being organisation obsessive
// but it also makes easy to see which methods are only being called the 1st time
private View newView() {
LayoutInflater inf = LayoutInflater.from(getContext());
View v = inf.inflate(R.layout.map_result_list, null);
Holder h = new Holder();
// here we store that holder inside the view itself
v.setTag(h);
// and only call those findById on this first start
h.storeName = (TextView) v.findViewById(R.id.txtLine1);
h.address = (TextView) v.findViewById(R.id.txtLine2);
h.postcode = (TextView) v.findViewById(R.id.txtLine3);
h.distance = (TextView) v.findViewById(R.id.txtDistance);
return v;
}
// this class is here just to hold reference to the UI elements
// findViewById is a lengthy operation so this is one of the optimisations
private class Holder {
TextView storeName;
TextView address;
TextView postcode;
TextView distance;
}
http://www.youtube.com/watch?v=wDBM6wVEO70。看看链接。你的问题可能已经回答了。 – Raghunandan
如果列表中有三个项目,并且屏幕上有三个ListView中的空间,getView()将被调用三次,并使用空视图来创建这三行。您无法回收目前正在使用的行。 – Raghunandan
好吧,我明白了,是基本上将视图放到列表中的视图v = vi.inflate(.layout.inbox_row,null)的布局充气器? – Javacadabra