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()方法。
任何问题?