Android自定义列表视图

我经历了教程和搜索,但我仍然无法理解,

getView(int position, View convertView, ViewGroup arg2) 

扩展BaseAdapter在我的Android应用程序中创建自定义listView时,该方法有效。 因此,我无法准确编辑自定义列表视图。

我需要知道这个方法何时调用以及参数的含义。

如果有人能解释下面的方法很棒。 谢谢

 @Override public View getView(int position, View convertView, ViewGroup arg2) { ViewHolder holder; LayoutInflater inflater = context.getLayoutInflater(); if (convertView == null) { convertView = inflater.inflate(R.layout.listitem_row, null); holder = new ViewHolder(); holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); holder.txtViewDescription = (TextView) convertView.findViewById(R.id.textView2); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.txtViewTitle.setText(title[position]); holder.txtViewDescription.setText(description[position]); return convertView; } 

getView() :如规范中所述,getView方法显示指定位置的数据。 因此,当你setAdapter并滚动listView时,将调用getView方法。

您在此处复制的方法是EfficientAdapter的一部分,用于优化ListView性能以及使用ViewHolder模式的优化。

从规格复制:只有更多的解释

position :项目在我们想要的视图的项目的适配器数据集中的位置。

convertView :如果可能的话,重用旧视图。 注意:在使用之前,您应该检查此视图是否为非null且具有适当的类型。 如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。 异构列表可以指定其视图类型的数量,以便此View始终是正确的类型(请参阅getViewTypeCount()和getItemViewType(int))。

因此,在上面的方法中,当您执行以下操作时,您将重用convertView。

  if (convertView == null){ .... convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } 

通过做以下事情,你避免查找(findViewById),这就是ViewHolder模式的好处

  holder.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1); 

parent :此视图最终将附加到的父级

编辑

问题:调用getView的次数以及创建的convertView数量是多少? 答:让我们举一个ApiDemos的Efficeint Adapter示例 。 如果你的屏幕显示10行,那么,

convertView计数 :10 + 1 = 11(10行你在屏幕上看到的,一个额外的显示滚动效果)。 这意味着if(convertView == null){…}块中的语句只会被调用11次。

getView Count :最初计数将为10,但是当你开始滚动计数时继续增加。 每次都调用getView来更新数据。

注意:这仅适用于所提到的getView方法。

在代码中调用setAdapter时会调用getView() 。 之后,当您将焦点移到列表上或选择任何项目或调用notifyDataSetChanged() ,您将在getView()调用。

Position – 项目在我们想要的视图的项目的适配器数据集中的位置。

convertView – 如果可能,重用旧视图。 注意:在使用之前,您应该检查此视图是否为非null且具有适当的类型。 如果无法转换此视图以显示正确的数据,则此方法可以创建新视图。 异构列表可以指定其视图类型的数量,以便此视图始终是正确的类型

ViewGroup – 最终将附加此视图。

以下是getView()参数的说明:

int position – 列表中视图的位置;

View convertView – 恕我直言,这是最难理解的参数。 在列表的工作开始时convertView = null。 但是当你开始向下滚动时,当一个列表项(它是View实例)被隐藏时,它就像convertView一样存储在内存中。 这个技巧允许您在滚动列表时不创建新项目 ,但使用存储在memmory中的convertView 。 因此,成为convertView的列表的第一项是0位置的项目。 请记住,当您向下滚动ListView时(从0位置到更大位置),如果向上滚动ListView, convertView将位于顶部和底部。

ViewGroup arg2 – 这是您的ListView (此类派生自ViewGroup )。

ViewHolder是一种模式,可以与列表的项目进行舒适的通信。 您将此对象设置为项目的标记,并可以将它们用于与列表项目的间接交互,因为它引用项目的字段( View.setTag(holder) )。

每当Android需要绘制另一个列表的项目时,就会调用getView()方法。

任何问题?