Render Xamarin Forms рассматривает как Android-представление без указания размера

Я использую собственный Xamarin.Android RecyclerView в своем XAML, как описано здесь. RecyclerView управляет одним представлением на элемент на экране (отображается только как вертикальный список в моем приложении). Это отлично работает, если я использую представление Xamarin.Android в качестве представления элемента (в этом примере TextView):

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
  var view = new TextView(parent.Context);
  return new TestViewHolder(view);
}

Однако я бы очень хотел, чтобы это определяло элемент управления Xamarin.Forms и использовал RecyclerView. Я могу использовать встроенный рендеринг для Android, чтобы получить представление Android, и это работает (т.е. Отображает правильные данные):

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
    var label = new Label { Text = "Hello!" };
    var cv = new ContentView
    {
        VerticalOptions = LayoutOptions.Start,
        HorizontalOptions = LayoutOptions.Start,
        Content = label,
    };
    var renderer = Xamarin.Forms.Platform.Android.Platform.CreateRendererWithContext(cv, parent.Context);
    var view = renderer.View;
    renderer.Tracker.UpdateLayout();
    view.LayoutParameters = new RecyclerView.LayoutParams(parent.Width, parent.Height);
    cv.Layout(Rectangle.FromLTRB(0, 0, parent.Width, parent.Height));
    view.Layout(0, 0, (int)cv.Width, (int)cv.Height);

    return new TestViewHolder(label, view);
}

Тем не менее, результирующее представление Android всегда имеет высоту и ширину, установленные для любого размера, который я передаю, даже если я использую горизонтальные/вертикальные опции Start везде. Я хочу, чтобы представление Android занимало только пространство, которое ему нужно (по крайней мере, вертикально, оно свободно расширяется горизонтально).

Подобный вопрос, без каких-либо ответов: Как добавить контент Xamarin Forms в качестве подзадачи в Xamarin.Android и Xamarin.iOS

Ответ 1

Вы можете использовать собственный интерфейс пользовательского интерфейса.

TextView вместо Label, LinearLayout или другой ViewGroup вместо ContentView.

Этот элемент управления пользовательским интерфейсом может достичь той же цели, просто TestViewHolder класс TestViewHolder и метод OnCreateViewHolder, как TestViewHolder ниже:

TestViewHolder:

public class TestViewHolder : RecyclerView.ViewHolder
{

    public TextView Label { get; }

    public TestViewHolder(TextView label, Android.Views.View view) : base(view)
    {
        Label = label;

    }
}

OnCreateViewHolder:

public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
    TextView tv = new TextView(parent.Context);
    tv.SetTextColor(Android.Graphics.Color.Black);
    tv.SetTextSize(Android.Util.ComplexUnitType.Dip,5.0f);
    tv.SetBackgroundColor(Android.Graphics.Color.Red);
    LinearLayout ll = new LinearLayout(parent.Context);
    ll.LayoutParameters=new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MatchParent, RecyclerView.LayoutParams.WrapContent);
    ll.SetBackgroundColor(Android.Graphics.Color.Green);
    ll.AddView(tv);

    return new TestViewHolder(tv,ll);
}