在android中,我通常使用MyAdapter extends ArrayAdapter
创建视图,ListView
因此,我必须重写该函数
public View getView(int position, View convertView, ViewGroup parent) {
// somecode here
}
但是,我不知道具体做什么convertView
和parent
做什么!有人有建议吗?更详细,更多帮助!谢谢!
从文档中,
convertView - 如果可能的话,要重用的旧视图。注意:在使用之前,您应该检查此视图是否为非空且类型合适。如果无法将此视图转换为显示正确的数据,则此方法可以创建一个新视图。
换句话说,此参数严格用于提高您的Adapter
. 当 aListView
使用 anAdapter
用 s 填充其行时,适配器通过调用每一行来View
用一个对象填充每个列表项。Adapter 使用来回收不再使用的旧对象。通过这种方式,可以向适配器发送不再显示的旧的“回收”视图对象,而不是在适配器每次想要显示新列表项时实例化一个全新的对象。这就是参数的目的。View
getView()
convertView
View
ListView
convertView
convertView
用于重用旧视图。
请了解android中的Adapter
功能。Adapter
使您可以使用新数据重用某些视图。
所以如果一个列表有 15 个项目,但是 window 只能显示 5 个项目,那么一开始convertView
会是 null,我们需要为这五个项目创建新的视图,但是当你向下滚动时,你有两个选择,要么创建 6 -10 个视图,或重新使用旧视图并将新数据加载到这些视图中。
Adapter
并使convertView
您能够执行后一种方法。
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;
}
较短的版本:
请阅读@Alex Lockwood 和@jeet 的回答。
我的回答:
在为什么之前,使用in的更好/正确的方法是什么?Romain Guy 在此视频中进行了很好的解释。convertView
getView()
一个例子,
@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 中的图表],不重新创建已经创建的视图。
来源:欢迎任何更正。我实际上通过这些链接收集了这些信息,
阅读getView()
Android 开发者文档。
getView()
Romain Guy 在 Google IO 2009的视频“Turbo Charge Your UI”中谈到了用于演示的材料。
Lucas Rocha的精彩博客。
那些想深入研究源代码的人:ListView和一个示例实现getView()
可以在 arrayAdapter 的源代码中看到。
类似的 SO 帖子。