例如(Xamarin c#示例,但Android java的概念也相同): "数据"是保存数据的类
public override View getView (int position, View convertView, ViewGroup parent){
if( convertView == null ){
convertView = inflater.inflate(Resource.layout.my_list_item, parent, false);
}
//just for example , hence avoiding ViewHolder here
var textView = convertView.FindViewById<TextView>(Resource.Id.textView2);
var imageView = convertView.FindViewById<ImageView>(Resource.Id.feedImageView);
text.Text = data.getText(position);
imageView = GetImageAsynch(data.getURL(position));
return convertView;
}
这里对于列表中的每一行,都添加/刷新了textView和imageView,这最初很好,但是当用户滚动并且当程序开始使用循环视图时,为什么我们需要重新赋值(文本)和图像)如果它已经存在于回收的视图中,那将是一个过头的权利吗?如果我这样做怎么办:
public override View getView (int position, View convertView, ViewGroup parent){
if( convertView == null ){
convertView = inflater.inflate(R.layout.my_list_item, parent, false);
}
//just for example , hence avoiding ViewHolder here
var textView = convertView.FindViewById<TextView>(Resource.Id.textView2);
var imageView = convertView.FindViewById<ImageView>(Resource.Id.feedImageView);
//this means if (recycled) view is empty, then only update the view
if(text.Text == "")
{
text.Text = data.getText(position);
imageView = GetImageAsynch(data.getURL(position));
}
return convertView;
}
这对我来说很好,但我担心的是我在这里或互联网上看到的很多例子中都没有看到任何这样的模式。
谢谢
更新:添加&#34;数据&#34;上课以更清楚地了解问题
答案 0 :(得分:2)
当视图被回收时,它不一定是Adapter
的相同项目(实际上,大多数情况下,它不是 - 最常见的例子是“项目进入当您向下滚动时,在顶部视图之外,重新插入底部“)。这就是为什么值需要重新分配的原因,因为它们几乎总是取决于position
的值,这与上次使用此视图时的值不同。
在图像文本总是相同的情况下,您的示例有点微不足道,但在适配器视图的大多数用法中并非如此。