29

在android中,我通常使用MyAdapter extends ArrayAdapter创建视图,ListView因此,我必须重写该函数

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

但是,我不知道具体做什么convertViewparent做什么!有人有建议吗?更详细,更多帮助!谢谢!

4

4 回答 4

51

从文档中,

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

换句话说,此参数严格用于提高您的Adapter. 当 aListView使用 anAdapter用 s 填充其行时,适配器通过调用每一行来View用一个对象填充每个列表项。Adapter 使用来回收不再使用的旧对象。通过这种方式,可以向适配器发送不再显示的旧的“回收”视图对象,而不是在适配器每次想要显示新列表项时实例化一个全新的对象。这就是参数的目的。ViewgetView()convertViewViewListViewconvertView

于 2012-05-12T02:46:02.317 回答
30

convertView用于重用旧视图。

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

所以如果一个列表有 15 个项目,但是 window 只能显示 5 个项目,那么一开始convertView会是 null,我们需要为这五个项目创建新的视图,但是当你向下滚动时,你有两个选择,要么创建 6 -10 个视图,或重新使用旧视图并将新数据加载到这些视图中。 Adapter并使convertView您能够执行后一种方法。

于 2012-05-12T04:32:49.897 回答
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;
}
于 2012-05-12T02:46:05.847 回答
3

较短的版本

请阅读@Alex Lockwood 和@jeet 的回答。

我的回答

在为什么之前,使用in的更好/正确的方法是什么?Romain Guy 在此视频中进行了很好的解释。convertViewgetView()

一个例子

@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 帖子。

什么是convertview-parameter-in-arrayadapter-getview-method

我如何选择将视图转换为重用

当创建您自己的自定义适配器时,getview 方法如何工作

于 2016-09-21T17:36:58.480 回答