2012-05-12 73 views
21

在Android中,我通常使用MyAdapter extends ArrayAdapterListView创建视图,并作为一个结果,我不得不重写功能ListView适配器中`convertView`的用途是什么?

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

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

回答

38

从文档,

convertView - 老视图如果可能的话再利用。注意:你应该在使用之前检查这个视图是非空的并且是合适的类型。如果无法将此视图转换为显示正确的数据,则此方法可以创建新视图。

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

4

convertView是不可见的ListView项缓存,因此可以重复使用。它让ListView不需要创建大量的ListItems,因此节省了Memeory并使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; 
} 
+1

所以,我应该使用convertView如果我建我的看法没有充气XML文件? –

+0

@DanChaltiel是的,你做 – localhost

21

convertView用于重新使用旧视图。

请理解在Android中的AdapterfunctionalityAdapter使您可以重新使用新数据的某些视图。

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

+0

非常有用。用简单的话来形容。 – tpk

1

较短的版本

请阅读@Alex洛克伍德的和@截拳道的答案。

我的回答

为什么之前,这是更好/使用getView()convertView的正确方法是什么?由罗曼盖伊在这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用于性能优化 [在滑块14 see图表由罗曼盖伊]通过不重新创建一个已创建的图。

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

阅读关于getView() Android developer documentation

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

Lucas Rocha的精彩blog

那些想深入研究源代码的人:ListViewgetView()的示例implementation可以在arrayAdapter的源代码中看到。

相似的SO帖子。

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

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