我经历了教程和搜索,但我仍然无法理解,
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:如果可能的话,重用旧视图.注意:你应该检查一下
在使用之前,view是非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数量是多少?
答:让我们举一个Efficeint Adapter from ApiDemos的例子.如果你的屏幕显示10行,那么,
convertView计数:10 1 = 11(10行你在屏幕上看到的,一个额外的显示滚动效果).这意味着if(convertView == null){…}块中的语句只会被调用11次.
getView Count:最初计数将为10,但是当你开始滚动计数时继续增加.每次都调用getView来更新数据.
注意:这仅适用于所提到的getView方法.