这正是你所说的,一种回收的形式。
膨胀布局需要大量内存和大量时间,因此为了提高效率,系统会将刚刚离开屏幕的内容传递给您,您可以简单地更新其文本和图像并将它们返回给 UI。
因此,例如,如果您的列表视图在其列表中显示 6 个项目(由于它的高度),它只会膨胀 6 个项目,并且在滚动期间它只会不断回收它们。
您应该使用一些额外的优化技巧,我相信评论者发布的视频链接会解释它们。
编辑
该示例是 Store 项目的 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;
}