在android中,我通常使用MyAdapter extends ArrayAdapter
为ListView
创建视图,因此,我必须覆盖函数
public View getView(int position, View convertView, ViewGroup parent) {
// somecode here
}
但是,我并不确切知道convertView
和parent
做了什么!有没有人有建议?更多细节,更多帮助!谢谢!
答案 0 :(得分:44)
从文档中
convertView - 如果可能,重用旧视图。注意:在使用之前,应检查此视图是否为非null且类型是否合适。如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。
换句话说,此参数严格用于提高Adapter
的效果。当ListView
使用Adapter
使用View
填充其行时,适配器通过在每行上调用View
来使用getView()
对象填充每个列表项。适配器使用convertView
作为回收不再使用的旧View
对象的方法。通过这种方式,每次适配器想要显示新的列表项时,ListView
都可以发送不再显示的旧的“循环”视图对象,而不是实例化全新对象。这是convertView
参数的目的。
答案 1 :(得分:25)
convertView
用于重复使用旧视图。
请理解android中的Adapter
functionality。 Adapter
使您可以使用新数据重用某些视图。
因此,如果列表包含15个项目,但窗口只能显示5个项目,那么首先convertView
将为空,我们需要为这五个项目创建新视图,但是当您向下滚动时,您有两个选项,可以创建6-10个视图,也可以重新使用旧视图并将新数据加载到这些视图中。
Adapter
和convertView
可让您执行后续方法。
答案 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