GetView обновляет элементы за пределами экрана

У меня есть следующий код внутри метода 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;
    }

Когда я изменяю свойство ScanOK и Ready на True, скажем, для первых 3 элементов в списке, он автоматически устанавливает цвет фона элементов за пределами экрана также на зеленый.

Как заставить его окрашивать только первые 3 элемента, не затрагивая элементы за пределами экрана?


person bigb055    schedule 04.02.2019    source источник
comment
Не могли бы вы предложить больше кода о ваших элементах списка? что значит tus[position].Ready tus[position].ScanOk tus[position].AtPackingStation? Вы можете отладить его, проверить if/else, соответствует ли это требованиям.   -  person Leon Lu - MSFT    schedule 05.02.2019
comment
@Leon Lu - MSFT Я уже отладил его и, например. для 10 элементов, если только первые 3 соответствуют критериям и действительно видны на экране, цвет фона некоторых других элементов все равно меняется. Кажется, он делает это случайно...   -  person bigb055    schedule 05.02.2019


Ответы (1)


Когда я изменяю свойства ScanOK и Ready на True, скажем, для первых 3 элементов в списке, он автоматически устанавливает цвет фона элементов за пределами экрана также на зеленый.

Как заставить его окрашивать только первые 3 элемента, не затрагивая элементы за пределами экрана?

Для этого вам нужно будет добавить начальное условие на основе позиции, например

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

Также, если вы хотите пометить на основе того, сколько элементов списка отображается на экране, вы можете проверить это ТАК ответьте

person FreakyAli    schedule 05.02.2019
comment
Что делать, если количество элементов для изменения цвета больше, чем количество элементов, видимых на экране? Я хочу, чтобы все элементы, отвечающие определенным условиям, меняли цвет, даже если они не на экране. Как узнать позицию последнего видимого элемента внутри GetView()? - person bigb055; 05.02.2019
comment
Я прикрепил ответ стека, который обрабатывает это, вы его проверяли? - person FreakyAli; 05.02.2019