为什么我们应该在 getView() 中为回收的转换视图重新分配值

本文关键字:视图 转换 分配 新分配 我们 getView 为什么 | 更新日期: 2023-09-27 18:35:34

例如(Xamarin c#示例,但Android java的概念也相同):"data"是保存数据的类

   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;
   }

这对我来说效果很好,但我担心的是,我在这里或互联网上看到的许多例子中都没有看到任何这样的模式。

谢谢

更新:添加了"数据"类以更清楚地说明问题

为什么我们应该在 getView() 中为回收的转换视图重新分配值

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

您的示例有点微不足道,因为图像的文本始终相同,但在适配器视图的大多数用法中并非如此。