0

到目前为止,我已经看到了几个使用BaseAdapterArrayAdapter<?>. 但我仍然不完全清楚为什么应该这样。

第一个例子是继承自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;     
}

现在在第二个示例中BaseAdapter,在 GridView 上使用 found 这是 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”静态类,这对应用程序性能和多个设备上的兼容性有什么影响(最低 API 8)。

4

2 回答 2

3

没有必要使用持有者类;确保尽可能重复使用 convertView 更为重要,因为这会显着提高速度。话虽如此,使用支架确实提供了更好的性能,尤其是在您显示大量项目时,因为 getView 不必每次都膨胀 xml。

该视频更详细地解释了这一点: http ://www.youtube.com/watch?v=wDBM6wVEO70

于 2013-04-08T21:38:03.777 回答
1

首先,我想向您介绍在 Google I/O '10 期间举行的 ListView 世界会议。值得观看该演示文稿(或通读 pdf)以更好地理解ListView机制以及为什么“ViewHolder/RowWrapper”模式可以显着加快速度。

getView()优化逻辑基本上有两个关键要素:

  • 使用回收视图(convertView传入的参数getView()
  • 尽量减少(昂贵的)findViewById()通话次数

在您的第一个示例中,如果没有可用的回收视图,则仅应用 ViewHolder 模式来膨胀行视图 - 这很好。其次,它通过使用 ViewHolder 对象标记行来减少视图查找的数量,该对象充当TextView之前已检索的包装器。

您的第二个示例不会扩展行视图,而是在运行时实例化它。它仍然会检查回收的视图是否可用,并在可能的情况下使用它——再一次,这很好。此外,由于行视图(或本例中的网格视图)只是一个ImageView,convertView可以简单地转换为ImageView. 请注意,如果行/网格视图不仅包含单个视图,则第一个片段中的 ViewHolder 方法将是合适的方法。

话虽如此,由于第一个片段中的行视图也只是一个TextView,因此可以使用与第二个片段中相同的 cast-convertView-approach 来简化它。行视图通常由多个视图组成,因此我建议始终使用 ViewHolder 模式,因为这将为您提供最大的灵活性以适应未来的变化。

于 2013-04-08T21:48:35.730 回答