到目前为止,我已经看到了几个使用BaseAdapter
和ArrayAdapter<?>
的应用程序示例。但我仍然不完全清楚为什么应该这样。
第一个例子是从ArrayAdapter<?>
扩展,这个例子在ListView中使用,以下是getView方法
@override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
Holder holder = null;
// Holder represents the elements of the view to use
// Here are initialized
if(null == row) {
row = LayoutInflater.from(mContext).inflate(LAYOUT_ITEM_ID, parent, false);
holder = new Holder();
holder.titleTextView = (TextView)row.findViewById(android.R.id.title);
row.setTag(holder);
} else {
holder = (Holder) row.getTag();
}
// here do operations in holder variable example
holder.titleTextView.setText("Title " + position);
return row;
}
public static class Holder {
TextView titleTextView;
}
现在在第二个例子中,在GridView上使用了BaseAdapter
,这是getView方法
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
我的问题是:为了正确使用适配器是必要的,以使用“Holder”静态类,这对应用程序性能和多个设备的兼容性有什么影响(min API 8)。
答案 0 :(得分:3)
没有必要使用持有人类;更重要的是确保尽可能重复使用convertView,因为这会显着提高速度。话虽这么说,使用持有者确实提供了更好的性能,特别是如果你要显示很多项目,因为getView不必每次都膨胀xml。
此视频详细解释了这一点:http://www.youtube.com/watch?v=wDBM6wVEO70
答案 1 :(得分:1)
首先,我想指出您在Google I / O '10期间举行的World of ListView session。值得观看该演示文稿(或通过pdf阅读)以更好地理解ListView
机制,以及为什么'ViewHolder / RowWrapper'模式可以显着提高速度。
优化getView()
逻辑基本上有两个关键因素:
convertView
的{{1}}参数)getView()
来电的数量在您的第一个示例中,如果没有可用的回收视图,ViewHolder模式仅应用于扩展行视图 - 这很好。其次,它通过使用ViewHolder对象标记行来减少视图查找的数量,该对象充当先前已检索的findViewById()
的包装。
您的第二个示例不会使行视图膨胀,而是在运行时实例化它。它仍会检查回收的视图是否可用并在可能的情况下使用 - 再次,这是好的。此外,由于行视图(或本例中的网格视图)只是一个TextView
,因此ImageView
可以简单地转换为convertView
。请注意,如果行/网格视图由而不仅仅是单个视图组成,则第一个代码段中的ViewHolder方法将是适当的方法。
话虽如此,由于第一个代码段中的行视图也只是一个ImageView
,因此可能使用与第二个代码段相同的cast-convertView方法进行简化。虽然行视图通常包含多个视图,但我建议始终使用ViewHolder模式,因为这将为您提供最大的灵活性以适应未来的变化。