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