0

Je rencontre un problème lorsque j'ai un listview qui contient un groupe de spinner. Si je sélectionne une option pour le premier spinner puis que je défile vers le bas, je vois un spinner que je n'ai même pas touché a la même valeur que le premier spinner que je viens de définir. Je suppose que c'est un problème avec la vue Spinner recyclé et mal utilisé ci-dessous. Est-ce que quelqu'un d'autre a rencontré ce problème avec des fileurs? Je pense que nous devons mettre en œuvre une solution similaire à this dans MvxAdapter?Problèmes avec MvxSpinner dans ListView

+0

En regardant le MvxAdapter dans le github MvvmCross.Binding.Droid.View.MvxAdapter, je vois que GetBindableView essaye de le gérer pour des situations normales. Je pense que [this] (http://stackoverflow.com/questions/14258866/spinner-reset-value-when-scrolling-in-a-custom-listview-with-arrayadapter) est le problème. – PkL728

Répondre

0

J'ai implémenté mes propres MyMvxAdapter et MyMvxListView pour gérer cela. La seule chose que j'ai changé dans MyMvxListView était de l'utiliser comme adaptateur MyMvxAdapter au lieu de MvxAdapter normal. J'ai alors changé le GetBindableView en MyMvxAdapter pour ressembler à ceci:

 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; 
     } 

Vous remarquerez la seule différence est que je avais besoin d'accéder directement à ma ressource spinner pour régler correctement si viewToUse est pas nul. Puis le dernier de la "sauce magique" consistait à garder trace de la valeur sélectionnée du spinner sur mon modèle de données, dans ce cas comme la propriété "SpinnerSelection" sur mon modèle qui est remplie à chaque fois que la valeur est sélectionnée.

Questions connexes