自定义ListView适配器显示不正确的值[Mono Android]

时间:2012-12-03 13:58:24

标签: android listview android-listview xamarin.android adapter

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

所以当我执行上面的代码时,这里是我得到的截图:

Items Repeat themselves when there should be 27 unique species here, of course this isnt the whole list but an example where you can see the looping happen!

正如您所看到的那样,我认为在传递的List变量中至少记录了27种不同的物种,这是重复的。任何关于为什么这样做以及如何解决这个问题的帮助都会非常有用。

我的研究

我已经读过它可能正在重用适配器的GetView方法中的“View currentView”变量。我在this link中找到了这些信息。我只是不知道如何解决这个问题。代码示例将是很好或详细的方向。谢谢你的时间。

2 个答案:

答案 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;