xamarin - 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 的文档,至少我找不到它,你们中的任何人都可以帮助我吗?
谢谢
解决方案
推荐阅读
- selenium - 如何检查元素是否被点击 - selenium
- python - `versioneer` 是否与`PyPI` 打包兼容?
- android - 我无法使用 FindViewById 找到元素
- apache-kafka - 无法访问 Pepperbox 或 kafkameter 中的 jmeter 变量
- symfony - symfony 4 使用服务设置全局设置以在 twig 中实现
- javascript - 如何从 php 服务器打印到 POS 打印机
- c# - 使用 tableadapter 复制行不会将更改提交到磁盘
- c# - System.Runtime.InteropServices.COMException (0x80004005)
- django - 如何使用 django 中的数据库条目生成 pdf 文件?
- javascript - 如何改变
- 至然后回到
- 具有新价值?