ListView适配器中`convertView`的目的是什么?

时间:2012-05-12 02:41:19

标签: java android

在android中,我通常使用MyAdapter extends ArrayAdapterListView创建视图,因此,我必须覆盖函数

public View getView(int position, View convertView, ViewGroup parent) {
    // somecode here
}

但是,我并不确切知道convertViewparent做了什么!有没有人有建议?更多细节,更多帮助!谢谢!

4 个答案:

答案 0 :(得分:44)

从文档中

  

convertView - 如果可能,重用旧视图。注意:在使用之前,应检查此视图是否为非null且类型是否合适。如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。

换句话说,此参数严格用于提高Adapter的效果。当ListView使用Adapter使用View填充其行时,适配器通过在每行上调用View来使用getView()对象填充每个列表项。适配器使用convertView作为回收不再使用的旧View对象的方法。通过这种方式,每次适配器想要显示新的列表项时,ListView都可以发送不再显示的旧的“循环”视图对象,而不是实例化全新对象。这是convertView参数的目的。

答案 1 :(得分:25)

convertView用于重复使用旧视图。

请理解android中的Adapter functionalityAdapter使您可以使用新数据重用某些视图。

因此,如果列表包含15个项目,但窗口只能显示5个项目,那么首先convertView将为空,我们需要为这五个项目创建新视图,但是当您向下滚动时,您有两个选项,可以创建6-10个视图,也可以重新使用旧视图并将新数据加载到这些视图中。 AdapterconvertView可让您执行后续方法。

答案 2 :(得分:5)

convertView是不可见的ListView项缓存,因此可以重复使用。它让ListView无需创建大量的ListItem,因此可以节省记忆并使ListView更加流畅。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if(convertView == null) {
        view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false);
    }
    else {
        view = convertView;
    }
    // remaining implementation
    return view;
}

答案 3 :(得分:1)

缩短版本

请阅读@Alex Lockwood&@ jeet的答案。

我的回答

之前为什么,在convertView中使用getView()更好/正确方式? Romain Guy在此video中做了很好的解释。

示例

@Override
 public View getView(final int position, View convertView, ViewGroup parent)            {
   View rowView = convertView;
   ViewHolder holderObject;

 if (rowView == null) {
     rowView = inflater.inflate(R.layout.list_single_post_or_comment, parent, false);
     holderObject = new HolderForContent();
     mapHolder(holderObject, rowView);
     rowView.setTag(holderObject);
   } else {
     holderObject = (HolderForContent) convertView.getTag();
   }
   setHolderValues(holderObject, position);
   return rowView;
 }

 private class ViewHolder {
    TextView mTextView;
 }

 mapHolder(holderObject, rowView) {
    //assume R.id.mTextView exists
    holderObject.mTextView = rowView.findViewById(R.id.mTextView);
 }

 setHolderValues(holderObject, position) {
    //assume this arrayList exists
    String mString = arrayList.get(position).mTextViewContent;
    holderObject.mTextView.setText(mString);
 }

上面只是一个例子,你可以遵循任何类型的模式。但是记住这个

@Override
 public View getView(final int position, View convertView, ViewGroup parent) {

   if (convertView == null) {
        // todo : inflate rowView. Map view in xml.
   } else {
        // todo : get already defined view references
   }

   // todo : set data to display

 return rowView;

 }

现在来到convertView目的为什么

通过不重新创建已创建的视图,

convertView用于Romain Guy的幻灯片14中的效果优化 [see图表]。

来源: 欢迎任何更正。我实际上通过这些链接收集了这些信息,

了解Android开发人员documentation中的getView()

Romain Guy在video" Turbo Charge Your UI"中谈到getView()。在Google IO 2009和material用于演示。

Lucas Rocha的精彩blog

可以在arrayAdapter的源代码中看到那些想要深入了解源代码的人:ListView以及getView()的样本implementation

类似的SO帖子。

what-is-convertview-parameter-in-arrayadapter-getview-method

how-do-i-choose-convertview-to-reuse

how-does-the-getview-method-work-when-creating-your-own-custom-adapter