为什么我们应该在getView()中为循环convertView重新赋值

时间:2014-12-28 22:01:16

标签: c# android android-listview xamarin

例如(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;上课以更清楚地了解问题

1 个答案:

答案 0 :(得分:2)

当视图被回收时,它不一定是Adapter相同项目(实际上,大多数情况下,它不是 - 最常见的例子是“项目进入当您向下滚动时,在顶部视图之外,重新插入底部“)。这就是为什么值需要重新分配的原因,因为它们几乎总是取决于position的值,这与上次使用此视图时的值不同。

在图像文本总是相同的情况下,您的示例有点微不足道,但在适配器视图的大多数用法中并非如此。