自定义 MvxRecyclerAdapter

Custom MvxRecyclerAdapter

我在 Xamarin.Android 应用程序中使用 MvvmCross。我想制作自己的自定义 MvxRecyclerAdapter,这样我就可以在 MvxRecyclerView 的每一行中有多个按钮。这是我的习惯 MvxRecyclerView:

public class TwoPieceMvxRecyclerView : MvxRecyclerView
{
    private bool _initialized;

    public TwoPieceMvxRecyclerView(Context context, IAttributeSet attr) : base(context, attr)
    {

    }

    public override Android.Support.V7.Widget.RecyclerView.Adapter GetAdapter()
    {
        if(!_initialized)
        {
            SetAdapter(new TwoPieceMvxRecyclerAdapter());
            _initialized = true;
        }

        return base.GetAdapter();
    }
}

这是我的习惯 MvxRecyclerAdapter:

public class TwoPieceMvxRecyclerAdapter : MvxRecyclerAdapter, IOnClickListener
{
    private ICommand _itemClickPiece1;
    private ICommand _itemClickPiece2;

    private View _clickablePiece1;
    private View _clickablePiece2;

    public TwoPieceMvxRecyclerAdapter()
    {
    }

    public ICommand ItemClickPiece1
    {
        get { return _itemClickPiece1; }
        set
        {
            if (ReferenceEquals(_itemClickPiece1, value))
            {
                return;
            }

            _itemClickPiece1 = value;
        }
    }

    public ICommand ItemClickPiece2
    {
        get { return _itemClickPiece2; }
        set
        {
            if (ReferenceEquals(_itemClickPiece2, value))
            {
                return;
            }

            _itemClickPiece2 = value;
        }
    }

    protected override Android.Views.View InflateViewForHolder(Android.Views.ViewGroup parent, int viewType, MvvmCross.Binding.Droid.BindingContext.IMvxAndroidBindingContext bindingContext)
    {
        var view = base.InflateViewForHolder(parent, viewType, bindingContext);

        _clickablePiece1 = view.FindViewById<View>(Resource.Id.clickable_piece1);
        _clickablePiece2 = view.FindViewById<View>(Resource.Id.clickable_piece2);

        _clickablePiece1.SetOnClickListener(this);
        _clickablePiece2.SetOnClickListener(this);

        return view;
    }

    public void OnClick(View v)
    {
        if (v == _clickablePiece1)
        {
            ItemClickPiece1.Execute(null);
        }
        else if (v == _clickablePiece2)
        {
            ItemClickPiece2.Execute(null);
        }
    }
}

当我 运行 应用程序时,我收到此错误:

Could not activate JNI Handle 0xbfd00978 (key_handle 0x6e44919) of Java type 'md5bd77c484e80df14e69d8c5ab04394fe0/TwoPieceMvxRecyclerView' as managed type 'AzzimovMobile.Droid.Components.TwoPieceMvxRecycler.TwoPieceMvxRecyclerView'.

System.InvalidOperationException: If you wan't to use single item-template RecyclerView Adapter you can't change it'sIMvxTemplateSelector to anything other than MvxDefaultTemplateSelector

您的 RecyclerView 缺少构造函数:

public TwoPieceMvxRecyclerView(IntPtr javaReference, JniHandleOwnership transfer): base(javaReference, transfer)
{
}

另请注意,您无需使用自定义 RecyclerView 来更改其 Adapter。您只需在 .cs 视图上获取 RecyclerView 实例并从那里设置适配器。这样的事情应该有效:

public class MyView: MvxFragment<MyViewModel>
{
    //...

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = base.OnCreateView(inflater, container, savedInstanceState);

        // ...

        var recycler = view.FindViewById<MvxRecyclerView>(Resource.Id.recycler);
        recycler.Adapter = new TwoPieceMvxRecyclerAdapter(((IMvxAndroidBindingContext)BindingContext);

        // you can even set a TemplateSelector here!
        recycler.ItemTemplateSelector = new MyTemplateSelector();
        // ...

        return view;
    }
}