我正在编写一个非常简单的“联系人”应用程序。现在,我只有一个ListView,每个名称旁边都是一个图像。只有20个联系人,每个图像的平均值约为4.5kb,因此启动它时我无法达到应用程序的内存限制。我不确定问题出在哪里,但我猜测它是在生成行的代码中。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.single_row, parent, false);
TextView name = (TextView) row.findViewById(R.id.topLine);
TextView phone = (TextView) row.findViewById(R.id.secondLine);
ImageView icon = (ImageView) row.findViewById(R.id.icon);
name.setText(contactArray.get(position).getName());
phone.setText((CharSequence) contactArray.get(position).getPhone().getWorkPhone());
new ImageDownloader(icon).execute(contactArray.get(position).getImageURL());
return row;
}
如果我注释掉与我的ImageView相关的行,问题就会消失。为什么这些线占用的内存超过了必要的数量?
答案 0 :(得分:2)
您正在为每个视图充气xml布局,而不是回收现有视图。膨胀布局是一项昂贵的操作(在内存中),所以你可以从那里开始。
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.your_layout, null);
}
TextView text = (TextView) convertView.findViewById(R.id.text);
text.setText("Position " + position);
return convertView;
}
然后使用ViewHolder模式
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.your_layout, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = convertView.getTag();
}
holder.text.setText("Position " + position);
return convertView;
}
private static class ViewHolder {
public TextView text;
}
来源:http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/