【问题标题】:What is the purpose of `convertView` in ListView adapter?ListView 适配器中“convertView”的用途是什么?
【发布时间】:2012-05-12 02:41:19
【问题描述】:

在android中,我通常使用MyAdapter extends ArrayAdapterListView创建视图,结果我不得不重写函数

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

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

【问题讨论】:

    标签: java android


    【解决方案1】:

    从文档中,

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

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

    【讨论】:

      【解决方案2】:

      convertView 用于重用旧视图。

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

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

      【讨论】:

      • 非常有用。用简单的话来描述。
      【解决方案3】:

      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;
      }
      

      【讨论】:

      • 那么,如果我在不扩展 XML 文件的情况下构建视图,我应该使用 convertView 吗?
      • @DanChaltiel 是的,你这样做
      【解决方案4】:

      短版

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

      我的答案

      在为什么之前,在getView() 中使用convertView更好/正确 方式是什么? 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 用于性能优化 [see 在幻灯片 14 中由 Romain Guy 绘制的图表],而不是重新创建已经创建的视图。

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

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

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

      Lucas Rocha 的精彩 blog

      想要深入了解源代码的人:ListViewgetView() 的示例 implementation 可以在 arrayAdapter 的源代码中看到。

      类似的 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

      【讨论】:

        猜你喜欢
        • 2016-01-14
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多