如何使用Xamarin Android Mvvmcross创建Recyclerview?

时间:2018-09-27 13:17:35

标签: android xamarin.android mvvmcross

我已遵循https://github.com/xamarin/monodroid-samples/tree/master/android5.0/RecyclerViewSample/RecyclerViewSample中的示例在xamarin android中的recyclerview中显示数据。对我来说很好。

但是根据我们的项目要求,我需要使用xamarin android mvvmcross显示一个recyclerview。我已经搜索了示例,但找不到有效的示例。

代码:

    main.xml

        <MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView
                android:id="@+id/recylerView"
                android:layout_width="match_parent"
                android:layout_height="120dp" 
                 android:layout_marginLeft="@dimen/margin_normal"
                 android:layout_marginRight="@dimen/margin_normal"
                android:layout_marginBottom="@dimen/margin_normal"
                 android:layout_marginTop="@dimen/margin_normal"
                android:background="#FFFF00"
                android:orientation="horizontal"

                android:divider="@null"
                android:dividerHeight="@dimen/divider_height_medium"
                local:MvxItemTemplate="@layout/item_list"
                local:MvxBind="ItemsSource CoffeeList" />

Fragment.cs


    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
             View v = inflater.Inflate(Resource.Layout.main, null);
             return v;
            }

item_list.xml
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        local:MvxBind="Text FirstName" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        local:MvxBind="Text LastName" />
</LinearLayout>

ViewModel.cs

    public class CoffeeViewModel : MvxViewModel
        {
        public CoffeeViewModel ()
        {
        }
     private string _firstName;
            public string FirstName
            {
                get => _firstName;
                set => SetProperty(ref _firstName, value);
            }

            private string _lastName;
            public string LastName
            {
                get => _lastName;
                set => SetProperty(ref _lastName, value);
            }
        }

现在,当我运行应用程序时,recyclerview显示为空。您能告诉我在绑定数据时是否丢失了什么吗?

2 个答案:

答案 0 :(得分:2)

首先安装软件包MvvmCross.Droid.Support.V7.RecyclerView

这里有一个简单的MvxRecyclerView的示例:

<mvvmcross.droid.support.v7.recyclerview.MvxRecyclerView
    ...
    local:MvxItemTemplate="@layout/item_template"
    local:MvxBind="ItemsSource Items; ItemClick ItemClickCommand; ItemLongClick ItemLongClickCommand" />

因此ItemsObservableCollection<T>的{​​{1}},ViewModelItemClickCommand的命令,当您单击一行并单击时将执行该命令。 ViewModel是您的ItemLongClick的命令,当您长时间单击一行时将执行该命令。

假设您有一个ViewModel

您的public ObservableCollection<PersonItemViewModel> Items {get;set;}具有以下属性:

PersonItemViewModel

因此,您的private string _firstName; public string FirstName { get => _firstName; set => SetProperty(ref _firstName, value); } private string _lastName; public string LastName { get => _lastName; set => SetProperty(ref _lastName, value); } 将被渲染为item_template.axml的每一行。 MvxRecyclerView(您要进行绑定)是DataContext的每个项目,即ObservableCollection<PersonItemViewModel>。这里是布局示例:

PersonItemViewModel

Android MvxRecyclerView中的更多信息 HIH

答案 1 :(得分:0)

如果您使用的是Mvvmcross 6,则将该代码放在.Droid项目的Setup.cs中:

protected override IEnumerable<Assembly> AndroidViewAssemblies =>
       new List<Assembly>(base.AndroidViewAssemblies)
       {
            typeof(MvxRecyclerView).Assembly,
       };

现在,您不必使用MvxRecyclerView的完整路径(MvvmCross.Droid.Support.V7.RecyclerView.MvxRecyclerView)。

现在,您可以像使用Android中的de RecyclerView一样使用MvxRecyclerView。