【问题标题】:Problems with MvxSpinner in ListViewListView 中 MvxSpinner 的问题
【发布时间】:2014-05-13 03:27:34
【问题描述】:
我有一个包含一组微调器的列表视图的问题。如果我为第一个微调器选择一个选项,然后向下滚动,我会看到一个我什至没有碰过的微调器与我刚刚设置的第一个微调器具有相同的值。我假设这是 Spinner 视图在下面被回收和不当使用的问题。有没有其他人遇到过微调器的这个问题?我在想我们需要在 MvxAdapter 中实现类似于this 的解决方案?
【问题讨论】:
-
看看 MvvmCross.Binding.Droid.View.MvxAdapter github中的 MvxAdapter 我看到 GetBindableView 尝试在正常情况下处理这个问题。我认为this 是问题所在。
标签:
android-listview
xamarin.android
xamarin
mvvmcross
android-spinner
【解决方案1】:
我实现了自己的 MyMvxAdapter 和 MyMvxListView 来处理这个问题。我在 MyMvxListView 中唯一更改的是让它使用 MyMvxAdapter 作为其适配器,而不是普通的 MvxAdapter。然后我将 MyMvxAdapter 中的 GetBindableView 更改为如下所示:
protected virtual View GetBindableView(View convertView, object dataContext, int templateId)
{
if (templateId == 0)
{
// no template seen - so use a standard string view from Android and use ToString()
return GetSimpleView(convertView, dataContext);
}
// we have a templateid so lets use bind and inflate on it :)
var viewToUse = convertView as IMvxListItemView;
if (viewToUse != null)
{
if (viewToUse.TemplateId != templateId)
{
viewToUse = null;
}
}
if (viewToUse == null)
{
viewToUse = CreateBindableView(dataContext, templateId);
}
else
{
var spinner = (MvxSpinner)convertView.FindViewById(Resource.Id.taskFieldSpinner);
if (spinner != null)
{
spinner.SetSelection(((WrappedEmployeeTaskField)dataContext).TheField.SpinnerSelection);
}
BindBindableView(dataContext, viewToUse);
}
return viewToUse as View;
}
您会注意到唯一真正的区别是,如果 viewToUse 不为空,我需要直接访问我的微调器资源以正确设置它。然后最后一个“魔法酱”是跟踪微调器在我的数据模型上选择的值,在这种情况下,我的模型上的属性“SpinnerSelection”在每次选择值时都会被填充。