【问题标题】:Custom ListView Adapter Showing Incorrect Values [Mono Android]显示错误值的自定义 ListView 适配器 [Mono Android]
【发布时间】:2012-12-03 13:58:24
【问题描述】:

您好 Stack Overflow Android 用户,

请帮忙解答以下问题:

问题

我正在为一个列出鱼类种类的应用程序编写一个功能。 我正在为适配器使用自定义 ListView 适配器类(我们称之为 FishSpeciesListAdapter)。我有27种鱼 现在记录为程序的默认值(您最终将能够添加 一些你自己也是)。问题是,当我将适配器链接到实际的 listview xml 对象时,它似乎一直在迭代相同的 5-6 个物种。

问题必须出在自定义适配器中,因为我已经测试了记录的物种,并且在我传递给适配器的列表中所有物种都不同。

这是我设置适配器的代码:

this.n_fishSpeciesListView = FindViewById<ListView> (Resource.Id.xml_fishSpeciesListView);
this.n_fishSpeciesListView.Adapter = new FishSpeciesListAdapter (this, 
this.n_model.SpecieManager.Species);

这是自定义 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 中找到了这些信息。我只是不知道如何在我的情况下解决这个问题。代码示例将是很好或详细的指导。感谢您的宝贵时间。

【问题讨论】:

  • GetItemId 应该返回当前位置开始

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


【解决方案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;

【讨论】:

  • 感谢您的帮助。它现在正在做我想做的事。但是,现在由于位图大小而出现内存不足错误。如果您也想提供帮助,我提出了一个新问题 (stackoverflow.com/questions/13685275/…)。再次感谢。
【解决方案2】:

你需要在它已经存在时重用它,或者在它不存在时创建一个新视图。在所有情况下,您都必须为您的 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;
}

【讨论】:

  • 感谢您的帮助。它现在正在做我想做的事。但是,现在由于位图大小而出现内存不足错误。如果您也想提供帮助,我提出了一个新问题 (stackoverflow.com/questions/13685275/…)。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多