我在创建自定义微调器适配器时遇到问题。我尝试使用列表中每个国家/地区项目左侧的国家/地区图片制作国家/地区选择器。它运行时没有错误,但是有一个奇怪的错误,列表项在选择项目并重新打开微调器时会改变位置。
这是我的适配器类:
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; }
}
答案 0 :(得分:0)
原来我不需要ViewHolder的任何东西。我刚用这个替换了整个GetView函数:
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;
}
问题解决了:D