任何人都可以请解释两种getView()实现之间有什么区别吗?这两种getView()的实现有什么区别?
第一个检查convertView
是否为空;如果它为null,则膨胀一个新的View对象。然后设置适当的值的子视图。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
{
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(R.layout.itemlayout, null, true);
}
ImageView image = (ImageView) convertView.findViewById(R.id.icon);
TextView text = (TextView) convertView.findViewById(R.id.name);
MyItem item = items[position];
text.setText(item.name);
if("male".equals(item.gender))
{
image.setImageResource(R.drawable.male);
}
else if("female".equals(item.gender))
{
image.setImageResource(R.drawable.female);
}
return convertView;
}
第二个是所谓的“ViewHolder”模式。许多开发人员说这种方法可以节省大量的内存和CPU时间。但是第一个实现也检查了convertView的存在。第一种方法不是保存一些内存吗?任何人都可以更深入,更清楚地解释两种实现之间的区别吗?非常感谢。
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
View itemView = convertView;
if(itemView == null)
{
LayoutInflater inflater = context.getLayoutInflater();
itemView = inflater.inflate(R.layout.itemlayout, null, true);
holder = new ViewHolder();
holder.image = (ImageView) itemView.findViewById(R.id.icon);
holder.text = (TextView) itemView.findViewById(R.id.name);
itemView.setTag(holder);
}
else
{
holder = (ViewHolder) itemView.getTag();
}
MyItem item = items[position];
holder.text.setText(item.name);
if("male".equals(item.gender))
{
holder.image.setImageResource(R.drawable.male);
}
else if("female".equals(item.gender))
{
holder.image.setImageResource(R.drawable.female);
}
return itemView;
}
这不仅仅是findViewById(),尽管它是最常见的用例。 ViewHolder可以也应该用来存储临时数据结构,以避免getView()中的内存分配。一个很好的例子可以在这里找到:http://goo.gl/NzgTt和http://goo.gl/d4vvo ViewHolder包含一个字符缓冲区,以避免从光标获取数据时的分配。 – 2011-05-19 16:30:40
相关提示=) – BFil 2011-05-19 17:19:13