0

我遇到了一個問題,其中包含一組spinners的listview。如果我爲第一個微調器選擇一個選項,然後向下滾動,我會看到一個我甚至沒有觸及的微調器與我剛剛設置的第一個微調器的值相同。我假設這是Spinner視圖被回收和下面不當使用的問題。其他人是否遇到了紡紗廠的這個問題?我認爲我們需要在MvxAdapter中實施類似this的解決方案?ListView中MvxSpinner的問題

+0

看MvvmCross.Binding.Droid.View.MvxAdapter中的MvxAdapter github我看到GetBindableView試圖在正常情況下處理這個問題。我認爲[這](http://stackoverflow.com/questions/14258866/spinner-reset-value-when-scrolling-in-a-custom-listview-with-arrayadapter)是問題。 – PkL728

回答

0

我實現了我自己的MyMvxAdapter和MyMvxListView來處理這個問題。我在MyMvxListView中改變的唯一的事情是讓它使用MyMvxAdapter作爲它的適配器而不是普通的MvxAdapter。然後我改變了GetBindableView在MyMvxAdapter看起來像這樣:

 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」,每次值被選中時都會被填充。