首页 > 解决方案 > ReactiveRecyclerViewAdapter 对更改没有反应

问题描述

我正在尝试使用 ReactiveRecyclerViewAdapter 根据我的 ViewModel 上的 SourceList 更新我的 RecyclerView,但没有太多关于此的文档,但我不应该是唯一一个为此苦苦挣扎的人。

视图模型:

 public class PassportScreenViewModel : ReactiveObject
{
    readonly IAccountService _accountService;

    public PassportScreenViewModel(IAccountService accountService = null)
    {
        _accountService = accountService ?? Locator.Current.GetService<IAccountService>();
        SchoolChoices = new SourceList<SchoolDataModel>();
        SchoolChoices.Add(new SchoolDataModel(new SchoolChoice() { Name = "My simple test" }));
        SchoolChoices.Add(new SchoolDataModel(new SchoolChoice() { Name = "My simple tes 2" }));
        AddSchoolCommand = ReactiveCommand.Create(() => {
            SchoolChoices.Edit(x => x.Add(new SchoolDataModel(new SchoolChoice() { Name = "My simple test " + SchoolChoices.Count })));
        });
    }

    [Reactive] public string Headline { get; set; }
    [Reactive] public string Title { get; set; }
    [Reactive] public string Company { get; set; }
    [Reactive] public SourceList<SchoolDataModel> SchoolChoices { get; set; }

    public ReactiveCommand AddSchoolCommand { get; set; }
}

我的片段:

[WireUpResource("recyclerView_passport_schools")]
    public RecyclerView SchoolsRecycler { get; private set; }

    [WireUpResource("textview_passport_addschool")]
    public Button AddSchoolButton { get; private set; }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = inflater.Inflate(Resource.Layout.fragment_passportscreen, container, false);
        this.WireUpControls(view);

        this.ViewModel = new PassportScreenViewModel();
        Photo.Click += Photo_Click;

        this.BindCommand(ViewModel, viewModel => viewModel.AddSchoolCommand, myView => myView.AddSchoolButton);

        var adapter = new SchoolReactiveAdapter(ViewModel.SchoolChoices.Connect());
        SchoolsRecycler.HasFixedSize = true;
        SchoolsRecycler.SetLayoutManager(new LinearLayoutManager(Activity));
        SchoolsRecycler.SetAdapter(adapter);

        ViewModel.SchoolChoices.Connect().Subscribe(x =>
        {
            //adapter = new SchoolReactiveAdapter(ViewModel.SchoolChoices.Connect());
            //SchoolsRecycler.SwapAdapter(adapter, true);
        });

        return view;
    }

还有我的适配器:

public class SchoolReactiveAdapter : ReactiveRecyclerViewAdapter<SchoolDataModel>
{
    public SchoolReactiveAdapter(IObservable<IChangeSet<SchoolDataModel>> backingList) : base(backingList)
    {
    }

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {
        var itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.item_school, parent, false);
        return new MySchoolViewHolder(itemView);
    }

    public class MySchoolViewHolder : ReactiveRecyclerViewViewHolder<SchoolDataModel>
    {
        [WireUpResource("textview_schoolitem_name")]
        public TextView SchoolName { get; private set; }

        public MySchoolViewHolder(View view) : base(view)
        {
            this.WireUpControls();
            this.Bind(ViewModel, vm => vm.Name, v => v.SchoolName.Text);
        }
    }
}

如果我取消注释:

  ViewModel.SchoolChoices.Connect().Subscribe(x =>
        {
            //adapter = new SchoolReactiveAdapter(ViewModel.SchoolChoices.Connect());
            //SchoolsRecycler.SwapAdapter(adapter, true);
        });

这将交换适配器并显示新项目,但我认为适配器应该在我执行 Connect() 时对 ViewModel 中的 ChangeSet 做出反应;

var adapter = new SchoolReactiveAdapter(ViewModel.SchoolChoices.Connect());

即使 List 是一个新项目, RecyclerView 也不会更新。没有关于如何使用 ReactiveUI 完全设置绑定 RecyclerView 的文档,至少我找不到它,你们中的任何人都可以帮助我吗?

谢谢

标签: xamarinxamarin.androiddynamic-datareactiveui

解决方案


推荐阅读