Xamarin.Forms ListView с настраиваемым средством визуализации выбирает более одной строки после запуска прокрутки - PullRequest
0 голосов
/ 09 октября 2018

Мне нужно было изменить цвет выбранного элемента в ListView в моем приложении Xamarin.Forms, поэтому я реализовал пользовательский рендеринг для ViewCell.Это работало как требовалось, пока я не наполнил свой список таким количеством элементов, что его пришлось прокручивать.После появления прокрутки в списке возникает странная ошибка, при которой выбирается более одной строки (как при прокрутке списка, изменяется область, в которой список ищет выбранные элементы и не сбрасывает выбранный элемент).Мое лучшее предположение состоит в том, что мне нужно расширить мой рендерер для подсчета прокрутки ListView, но я понятия не имею, как это сделать.Кто-нибудь сталкивался с подобными проблемами?

Custom Renderer:

[assembly: ExportRenderer(typeof(ExtendedViewCell), typeof(ExtendedViewCellRenderer))]
namespace MyApp.Droid.PlatformSpecific.Renderers
{
    public class ExtendedViewCellRenderer : ViewCellRenderer
    {

        private Android.Views.View _cellCore;
        private Drawable _unselectedBackground;
        private bool _selected;

        protected override Android.Views.View GetCellCore(Cell item,
                                                            Android.Views.View convertView,
                                                            ViewGroup parent,
                                                            Context context)
        {
            _cellCore = base.GetCellCore(item, convertView, parent, context);
            _selected = false;
            _unselectedBackground = _cellCore.Background;
            return _cellCore;
        }

        protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
        {
            base.OnCellPropertyChanged(sender, args);
            if (args.PropertyName == "IsSelected")
            {
                _selected = !_selected;
                if (_selected)
                {
                    var extendedViewCell = sender as ExtendedViewCell;
                    _cellCore.SetBackgroundColor(extendedViewCell.SelectedBackgroundColor.ToAndroid());
                }
                else
                {
                    _cellCore.SetBackground(_unselectedBackground);
                }
            }
        }
    }
}

Custom ViewCell:

public class ExtendedViewCell : ViewCell
{
   public static readonly BindableProperty SelectedBackgroundColorProperty =
   BindableProperty.Create("SelectedBackgroundColor",
                                typeof(Color),
                                typeof(ExtendedViewCell),
                                Color.Default);

   public Color SelectedBackgroundColor
   {
       get { return (Color)GetValue(SelectedBackgroundColorProperty); }
       set { SetValue(SelectedBackgroundColorProperty, value); }
   }
}

Обновление: Мне удалось отследить проблему, вызванную различной реализацией кэширования в новых версиях Xamarin.Forms.Даже автору вышеупомянутого решения не удалось решить это в данный момент: Ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...