Мне нужно было изменить цвет выбранного элемента в 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.Даже автору вышеупомянутого решения не удалось решить это в данный момент: Ссылка