在Android上使用MvvmCross遇到了一个问题。
我有一个MvxListView,它是使用自定义适配器派生的,因此我可以为各种类型的项目显示不同的视图。这很好。
我看到的问题是偶尔会出现以下问题。 MvxListViewItem是在屏幕上创建并显示的,但没有任何绑定发生(我正在使用所有示例中显示的DelayBind,但未调用Action)。如果我然后在屏幕外滚动此项目并再次返回,则DelayBind操作将与绑定一起执行并填充项目?
很奇怪,一直给我带来麻烦。
有没有其他人遇到这个问题并将其解决?
class BaseCustomListItemView: MvxListItemView
{
public BaseCustomListItemView(Context context, IMvxLayoutInflater layoutInflater, object dataContext, int templateId)
: base(context, layoutInflater, dataContext, templateId)
{
this.DelayBind( () =>
{
this.CreateBinding(this).For( "ProfileImage" ).To<ActivityItemVM>(vm => vm.ActivityUser).Apply();
} );
}
public string ProfileImage
{
set
{
var nameControl = this.FindViewById<PlayerNameControl>(Resource.Id.name);
var imageControl = this.FindViewById<PlayerProfileControl>(Resource.Id.photo);
imageControl.SetPlayerId( value, nameControl );
}
}
}
我的自定义适配器如下所示:
class CustomAdapter : MvxAdapter
{
public CustomAdapter(Context context)
: base(context)
{
}
protected override IMvxListItemView CreateBindableView(object dataContext, int templateId)
{
if ( dataContext is EventApprovedActivityItemVM )
return new EventApprovedActivityListItemView(base.Context, base.BindingContext.LayoutInflater, dataContext, templateId);
if ( dataContext is AddedPlayerActivityItemVM )
return new AddedPlayerListItemView(base.Context, base.BindingContext.LayoutInflater, dataContext, templateId);
if ( dataContext is AchievementLevelUpActivityItemVM )
return new AchievementLevelUpListItemView(base.Context, base.BindingContext.LayoutInflater, dataContext, templateId);
if ( dataContext is EventCreatedActivityItemVM )
{
var item = new EventCreatedActivityListItemView( base.Context, base.BindingContext.LayoutInflater, dataContext, templateId );
// item.ImageId = ( (EventCreatedActivityItemVM)dataContext ).ImageID;
return item;
}
return new BaseCustomListItemView(base.Context, base.BindingContext.LayoutInflater, dataContext, templateId);
}
public override int GetItemViewType(int position)
{
var item = GetRawItem(position);
if (item is EventApprovedActivityItemVM)
return 0;
if (item is AddedPlayerActivityItemVM)
return 1;
if (item is AchievementLevelUpActivityItemVM)
return 2;
if (item is EventCreatedActivityItemVM)
return 3;
return 0;
}
public override int ViewTypeCount
{
get { return 4; }
}
protected override View GetBindableView(View convertView, object dataContext, int templateId)
{
if (dataContext is EventApprovedActivityItemVM)
templateId = Resource.Layout.eventapprovedactivityitem;
if (dataContext is AddedPlayerActivityItemVM)
templateId = Resource.Layout.addedplayeractivityitem;
if (dataContext is AchievementLevelUpActivityItemVM)
templateId = Resource.Layout.achievementlevelupactivityitem;
if (dataContext is EventCreatedActivityItemVM)
templateId = Resource.Layout.eventcreatedactivityitem;
return base.GetBindableView(convertView, dataContext, templateId);
}
}
由于 安迪