自定义MvxRecyclerAdapter

时间:2018-02-08 22:12:40

标签: xamarin.android mvvmcross

我在我的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);
        }
    }
}

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

  

无法激活JNI句柄0xbfd00978(key_handle 0x6e44919)   Java类型   &#39; md5bd77c484e80df14e69d8c5ab04394fe0 / TwoPieceMvxRecyclerView&#39;如   托管类型   &#39; AzzimovMobile.Droid.Components.TwoPieceMvxRecycler.TwoPieceMvxRecyclerView&#39;

     

System.InvalidOperationException:如果你不想使用单曲   item-template您无法更改的RecyclerView适配器   除了以外的任何东西,它的simvxTemplateSelector   MvxDefaultTemplateSelector

1 个答案:

答案 0 :(得分:0)

您在RecyclerView上缺少构造函数:

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

另请注意,您不需要使用自定义的RecyclerView来更改其适配器。您可以在.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;
    }
}