1

こんにちはスタックオーバーフロー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;
    }
}

したがって、上記のコードを実行すると、次のスクリーンショットが表示されます。

アイテムここに27のユニークな種があるはずのときに繰り返します。もちろん、これはリスト全体ではありませんが、ループが発生するのを見ることができる例です。

ご覧のとおり、渡されたList変数に少なくとも27の異なる種が記録されていると私が確信している重複があります。これがなぜであるか、そしてこれをどのように修正できるかについての助けは非常に役に立ちます。

私の研究

アダプタのGetViewメソッドで「ViewcurrentView」変数を再利用している可能性があることを読みました。私はこのリンクでその情報を見つけました。私の場合、これを修正する方法がわかりません。コード例は、良いまたは詳細な指示になります。お時間をいただきありがとうございます。

4

2 に答える 2

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;
}
于 2012-12-03T14:07:00.363 に答える
1

私が見るところ、あなたはconvertViewオブジェクトを間違って使用しています。このオブジェクトは、ビューがリサイクルされた場合に使用できます(たとえば、リストアイテムがビューからスクロールアウトされた場合)。これは、レイアウトxmlから再度膨らませる必要がないように使用できます(これはコストのかかるプロセスです)。

あなたがすべきことは、もしあればあなたのレイアウトxmlから膨らませることですconvertView==null。それ以外の場合は、オブジェクトを使用し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;
于 2012-12-03T14:12:21.047 に答える