2017-11-15 7 views
0

Ich habe ein Problem beim Erstellen eines benutzerdefinierten Spinner-Adapter. Ich versuche, einen Länderwähler mit dem Landesbild auf der linken Seite jedes Ländereintrags in der Liste zu erstellen. Es läuft ohne Fehler, aber es gibt einen seltsamen Bug, bei dem die Listenelemente ihre Positionen ändern, wenn sie ein Element auswählen und den Spinner wieder öffnen.Xamarin Android Spinner Adapter seltsamer Fehler

Hier ist meine Adapterklasse:

class SpinnerAdapter : BaseAdapter, ISpinnerAdapter 
{ 
    private string[] data; 
    private string[] dataValues; 
    private Context context; 
    private LayoutInflater inflater; 
    private bool drawableFlags; 

    public SpinnerAdapter(Context _context, string[] _data, string[] _dataValues, bool _drawableFlags) 
     :base() 
    { 
     context = _context; 
     data = _data; 
     dataValues = _dataValues; 
     drawableFlags = _drawableFlags; 

    } 
    public override int Count => data.Length; 

    public override Java.Lang.Object GetItem(int position) 
    { 
     return data[position]; 
    } 

    public override long GetItemId(int position) 
    { 
     //throw new NotImplementedException(); 
     return (long)position; 
    } 

    public string GetItemValue(int position) 
    { 
     return data[position]; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     //throw new NotImplementedException(); 
     View view = convertView; 
     SpinnerAdapterViewHolder holder = null; 
     if (view != null) 
     { 
      holder = view.Tag as SpinnerAdapterViewHolder; 
      string name = holder.CountryName.Text; 


     } 

     if(holder == null) 
     { 
      holder = new SpinnerAdapterViewHolder(); 
      var inflater = context.GetSystemService(Context.LayoutInflaterService).JavaCast<LayoutInflater>(); 
      //replace with your item and your holder items 
      //comment back in 
      view = inflater.Inflate(Resource.Layout.Spinner_Item_Layout, parent, false); 
      holder.CountryName = view.FindViewById<TextView>(Resource.Id.SpinnerItem); 
      holder.CountryName.Text = data[position]; 
      //holder.CountryValue = dataValues[position]; 
      if (drawableFlags) 
      { 
       Drawable flag = AppCommon.GetDrawableResourceByName("flag_" + dataValues[position], context); 
       flag.SetBounds(10, 10, 10, 10); 
       holder.CountryName.SetCompoundDrawablesWithIntrinsicBounds(flag, null, null, null); 
      } 
      view.Tag = holder; 
     } 
     return view; 
    } 


} 

class SpinnerAdapterViewHolder : Java.Lang.Object 
{ 
    public TextView CountryName { get; set; } 
    public string CountryValue { get; set; } 
} 

Antwort

0

Stellt sich heraus, ich brauche nicht eine der ViewHolder Sachen. Ich ersetzte die Gesamtheit der GetView Funktion mit diesem:

public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     var inflater = context.GetSystemService(Context.LayoutInflaterService).JavaCast<LayoutInflater>(); 

     convertView = inflater.Inflate(Resource.Layout.Spinner_Item_Layout, parent, false); 
     TextView textview = convertView.FindViewById<TextView>(Resource.Id.SpinnerItem); 
     textview.Text = data[position]; 
     if (drawableFlags) 
      { 
       Drawable flag = AppCommon.GetDrawableResourceByName("flag_" + dataValues[position], context); 
       flag.SetBounds(10, 10, 10, 10); 
       textview.SetCompoundDrawablesWithIntrinsicBounds(flag, null, null, null); 
      } 

     return convertView; 
    } 

Problem gelöst: D

Verwandte Themen