【问题标题】:GetView updating items outside of screenGetView 更新屏幕外的项目
【发布时间】:2019-02-04 22:26:14
【问题描述】:

我的自定义适配器的 GetView 方法中有以下代码:

public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var view = convertView ?? activity.LayoutInflater.Inflate(
                       Resource.Layout.ScannedTuListItem, parent, false);

        var scannedTu = view.FindViewById<TextView>(Resource.Id.scannedTu);

        var tuTxt = activity.Resources.GetString(Resource.String.tu);
        var custTxt = activity.Resources.GetString(Resource.String.customer);
        var orderTxt = activity.Resources.GetString(Resource.String.order);
        var targetBinTxt = activity.Resources.GetString(Resource.String.targetBin);

        scannedTu.Text = 
                        $"{tuTxt} {tus[position].No}" +
                        $"\n{custTxt} {tus[position].Customer} / {orderTxt} {tus[position].Order}" +
                        (string.IsNullOrEmpty(tus[position].TargetBin) ?
                        string.Empty : $"\n{targetBinTxt} {tus[position].TargetBin}");

        if (tus[position].AtPackingStation && !tus[position].Ready)
        {
            scannedTu.SetBackgroundColor(Color.Yellow);
            scannedTu.SetTextColor(Color.Black);
        }
        else if (tus[position].AtPackingStation && tus[position].Ready || tus[position].ScanOk == true)
        {
            scannedTu.SetBackgroundColor(Color.Green);
            scannedTu.SetTextColor(Color.Black);
        }
        else if (tus[position].ScanOk == false)
        {
            scannedTu.SetBackgroundColor(Color.Red);
            scannedTu.SetTextColor(Color.Black);
        }

        return view;
    }

当我将属性 ScanOKReady 更改为 True 时,例如,对于列表中的前 3 个项目,它会自动将屏幕外项目的背景颜色也设置为绿色。

如何让它只为前 3 个项目着色而不影响屏幕外的项目?

【问题讨论】:

  • 你能提供更多关于你的 listview 项目的代码吗? tus[position].Ready tus[position].ScanOk tus[position].AtPackingStation 是什么意思?可以调试一下,检查if/else是否满足要求。
  • @Leon Lu - MSFT 我已经调试过了,例如对于 10 个项目,如果只有前 3 个符合标准并且实际上在屏幕上可见,它仍然会更改其他一些项目的背景颜色。它似乎是随机的......

标签: xamarin.android baseadapter notifydatasetchanged getview


【解决方案1】:

当我将属性 ScanOK 和 Ready 更改为 True 时,例如,对于列表中的前 3 个项目,它会自动将屏幕外项目的背景颜色也设置为绿色。

如何让它只为前 3 个项目着色而不影响屏幕外的项目?

为此,您必须根据位置添加初始条件,例如

   If(position>2) //since integers start from zero
   return;

此外,如果您想根据屏幕上显示的列表项的数量进行标记,您可以查看SO answer

【讨论】:

  • 如果要更改颜色的项目数大于屏幕上可见的项目数怎么办?我希望所有符合某些条件的项目即使在屏幕外也能改变颜色。我如何知道GetView() 中最后一个可见项目的位置?
  • 我附上了一个堆栈答案,你检查了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多