Hello Stack Overflow Android Users,
请帮助解决以下问题:
我正在为列出鱼种的应用编写一个功能。 我正在使用自定义ListView Adapter类(让我们称之为 FishSpeciesListAdapter )作为适配器。我有27种鱼类 现在作为程序的默认记录(您最终将能够添加 一些你自己)。问题是当我将适配器链接到实际的listview xml对象时,它似乎一直迭代相同的5-6种。
问题必须在自定义适配器中,因为我已经测试了记录的物种,并且我传递给适配器的List中的所有物种都不同。
以下是我设置适配器的代码:
this.n_fishSpeciesListView = FindViewById<ListView> (Resource.Id.xml_fishSpeciesListView);
this.n_fishSpeciesListView.Adapter = new FishSpeciesListAdapter (this,
this.n_model.SpecieManager.Species);
这是Custom ListView适配器代码:
public class FishSpeciesListAdapter : BaseAdapter
{
Context n_context;
List<AppCode.Specie> n_specieData;
public FishSpeciesListAdapter (Context context, List<AppCode.Specie> specieData)
{
this.n_context = context;
this.n_specieData = specieData;
}
public override int Count {
get { return this.n_specieData.Count; }
}
public override Java.Lang.Object GetItem (int position)
{
return null;
}
public override long GetItemId (int position)
{
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public override View GetView (int position, View convertView, ViewGroup parent)
{
View v;
if(convertView==null){
LayoutInflater li = LayoutInflater.FromContext(parent.Context);
v = li.Inflate(Resource.Layout.Adapter_FishSpeciesIcon, null);
ImageView iconImage = (ImageView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesIconImage);
TextView nameText = (TextView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesNameText);
TextView scientificNameText = (TextView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesScientificNameText);
nameText.Text = this.n_specieData[position].Name;
scientificNameText.Text = this.n_specieData[position].ScientificName;
if (this.n_specieData[position].RelatedMedia.AttachedPhotos.Count < 1)
{
iconImage.SetImageResource(Resource.Drawable.Icon);
}
else
{
iconImage.SetImageBitmap(BitmapFactory.DecodeByteArray(this.n_specieData[position].RelatedMedia.AttachedPhotos[0], 0, this.n_specieData[position].RelatedMedia.AttachedPhotos[0].Length));
}
}
else
{
v = convertView;
}
return v;
}
}
所以当我执行上面的代码时,这里是我得到的截图:
正如您所看到的那样,我认为在传递的List变量中至少记录了27种不同的物种,这是重复的。任何关于为什么这样做以及如何解决这个问题的帮助都会非常有用。
我已经读过它可能正在重用适配器的GetView方法中的“View currentView”变量。我在this link中找到了这些信息。我只是不知道如何解决这个问题。代码示例将是很好或详细的方向。谢谢你的时间。
答案 0 :(得分:1)
您需要在已存在时重用convertView,或者在不存在时再创建新视图。在所有情况下,您必须为textViews / imageViews提供正确的属性:
public override View GetView (int position, View convertView, ViewGroup parent)
{
if(convertView==null){
LayoutInflater li = LayoutInflater.FromContext(parent.Context);
convertView = li.Inflate(Resource.Layout.Adapter_FishSpeciesIcon, null);
}
ImageView iconImage = (ImageView)convertView.FindViewById(Resource.Id.xml_adapter_fishSpeciesIconImage);
TextView nameText = (TextView)convertView.FindViewById(Resource.Id.xml_adapter_fishSpeciesNameText);
TextView scientificNameText = (TextView)convertView.FindViewById(Resource.Id.xml_adapter_fishSpeciesScientificNameText);
nameText.Text = this.n_specieData[position].Name;
scientificNameText.Text = this.n_specieData[position].ScientificName;
if (this.n_specieData[position].RelatedMedia.AttachedPhotos.Count < 1)
{
iconImage.SetImageResource(Resource.Drawable.Icon);
}
else
{
iconImage.SetImageBitmap(BitmapFactory.DecodeByteArray(this.n_specieData[position].RelatedMedia.AttachedPhotos[0], 0, this.n_specieData[position].RelatedMedia.AttachedPhotos[0].Length));
}
}
return convertView;
}
答案 1 :(得分:1)
从我看到的情况来看,你使用convertView
对象是错误的。如果任何视图已被回收(例如,列表项滚动到视图外),则此对象可用。它是可用的,因此您不必再次从布局xml中膨胀(这是一个代价高昂的过程)。
如果convertView==null
,您应该从布局xml中膨胀。否则使用convertView
对象。
if(convertView==null){
LayoutInflater li = LayoutInflater.FromContext(parent.Context);
v = li.Inflate(Resource.Layout.Adapter_FishSpeciesIcon, null);
}
else{
v=convertView;
}
然后使用v设置所有值并返回视图。
ImageView iconImage = (ImageView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesIconImage);
TextView nameText = (TextView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesNameText);
TextView scientificNameText = (TextView)v.FindViewById(Resource.Id.xml_adapter_fishSpeciesScientificNameText);
nameText.Text = this.n_specieData[position].Name;
scientificNameText.Text = this.n_specieData[position].ScientificName;
if (this.n_specieData[position].RelatedMedia.AttachedPhotos.Count < 1)
{
iconImage.SetImageResource(Resource.Drawable.Icon);
}
else
{
iconImage.SetImageBitmap(BitmapFactory.DecodeByteArray(this.n_specieData[position].RelatedMedia.AttachedPhotos[0], 0, this.n_specieData[position].RelatedMedia.AttachedPhotos[0].Length));
}
return v;