自从我在1月份开始处理需要自定义渲染器的项目以来,我一直有这个问题。
我们的目标是拥有自定义列表视图 - 列表项必须在2行3列网格中显示四个重要信息: - 第1列中的第1行和第2行合并,显示单个大数字(如ImageCell中) - 第2列和第3行中的第1行显示中等字体大小的文本 - 第2列中的第2行显示字体较小的文本 - 第3列中的第2行显示字体较小的文本,与右侧对齐
现在,为此我尝试了ViewCell,但鉴于它是如何渲染和生成的,它非常慢(与例如TextCell相比,布局相同,速度慢6-7倍)。
代码如下:
PCL课程:
public class ExtendedCell : ViewCell
{
public static readonly BindableProperty BigNumProperty = BindableProperty.Create<ExtendedCell, String>(p => p.BigNum, default(String));
public String BigNum
{
get { return (String)GetValue(BigNumProperty); }
set { SetValue(BigNumProperty, value); }
}
public static readonly BindableProperty TextProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Text, default(String));
public String Text
{
get { return (String)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly BindableProperty DetailProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Detail, default(String));
public String Detail
{
get { return (String)GetValue(DetailProperty); }
set { SetValue(DetailProperty, value); }
}
public static readonly BindableProperty DateProperty = BindableProperty.Create<ExtendedCell, String>(p => p.Date, default(String));
public String Date
{
get { return (String)GetValue(DateProperty); }
set { SetValue(DateProperty, value); }
}
public static readonly BindableProperty BackgroundColorProperty = BindableProperty.Create<ExtendedCell, Color>(p => p.BackgroundColor, default(Color));
public Color BackgroundColor
{
get { return (Color)GetValue(BackgroundColorProperty); }
set { SetValue(BackgroundColorProperty, value); }
}
public static readonly BindableProperty ForegroundColorProperty = BindableProperty.Create<ExtendedCell, Color>(p => p.ForegroundColor, default(Color));
public Color ForegroundColor
{
get { return (Color)GetValue(ForegroundColorProperty); }
set { SetValue(ForegroundColorProperty, value); }
}
public ExtendedCell()
{
}
}
WP8渲染器:
[assembly: ExportCell(typeof(ExtendedCell), typeof(ExtendedCellRenderer))]
public class ExtendedCellRenderer : ViewCellRenderer //ICellRenderer, IRegisterable
{
public ExtendedCellRenderer()
{
}
public override System.Windows.DataTemplate GetTemplate(Cell cell)
{
return (System.Windows.DataTemplate)App.Current.Resources["ExtendedCellTemplate"];
}
}
Android渲染器:
[assembly:ExportCell(typeof(ExtendedCell),typeof(ExtendedCellRenderer))]
class ExtendedCellRenderer : ViewCellRenderer
{
private Android.Views.View extendedCell;
static ExtendedCellRenderer()
{
}
protected override Android.Views.View GetCellCore(Cell item, Android.Views.View convertView, ViewGroup parent, Context context)
{
var cell = (ExtendedCell)item;
var view = convertView;
if (view == null)
{
view = (context as Activity).LayoutInflater.Inflate(Resource.Layout.ExtendedCellLayout, null);
}
else
{
}
view.FindViewById<TextView>(Resource.Id.bigNumText).Text = cell.BigNum;
view.FindViewById<TextView>(Resource.Id.subjecText).Text = cell.Text;
view.FindViewById<TextView>(Resource.Id.topicText).Text = cell.Detail;
view.FindViewById<TextView>(Resource.Id.dateText).Text = cell.Date;
return view;
}
protected override void OnCellPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnCellPropertyChanged(sender, e);
}
}
在WP上,代码运行,它显示一个TextCell(在WP上,常规Cell&#39被设置为使用TextCellRenderer)。在Android上,它默认为CellRenderer,而后者则不显示任何内容。
上面的代码表示一个新状态,我在ViewCellRenderer类上创建了CellRenderers(之前它基于CellRenderer和ICell + IRegisterable)。
可能是什么问题?为什么它不起作用,我错过了一步吗?