0

以前は PHP と js に取り組んでいましたが、最近は Android の listview に取り組んでいます。ただし、listview 用のカスタム アダプタの作成で問題が発生しました。

public View getView(int arg0, View arg1, ViewGroup arg2) {
        // TODO
        if (arg1 == null) {
            arg1 = myInflater.inflate(R.layout.grid, arg2, false);
        }
        TextView name = (TextView) arg1.findViewById(R.id.text1);
        TextView desc = (TextView) arg1.findViewById(R.id.text2);
        ImageView image = (ImageView) arg1.findViewById(R.id.image1);
        if (arg0 < images.length) {
            image.setImageResource(images[arg0]);
        }
        name.setText(names[arg0]);
        desc.setText(description[arg0]);
        return arg1;
    }

問題は、リストビュー グリッドに渡すコンテンツの配列が 3 つあることです。最初の 2 つの配列には 10 個の要素があり、最後の配列には 5 個しかありません。というわけで、最後の方は境界外です。5 を超えているかどうかをチェックする条件を追加したのですが、 行によっては args0 が増えていないようです?

if (arg0 < images.length) {
                image.setImageResource(images[arg0]);
            }

最初の 5 行と他のいくつかの行にも画像が設定されていますが、その理由と修正方法を教えてください。ありがとう

4

2 に答える 2

1

一般に

リストに表示したいのでData、データを表すオブジェクトを作成します。

上記のコメントで名前を付けたように:

public class ListEntry {
  String name = "";
  String gender = "";//use enum here perhaps -.-
  String photoUrl = null; //or use byte[] photo or whatever you've stored in your array before
  // write getters/setters for your members
}

次に、1 つの配列ListEntry[](または List<ListEntry>) を使用してすべてのデータにアクセスできます。このようにして、indexOutOfBoundsException を回避します。

オンラインで listadapter チュートリアルを検索します。たとえば、Vogellaのものなどです。

最初の 5 つ以上のエントリに画像があるのはなぜですか?

リストビュー用の Android アダプターは、新しいリスト項目 (行など) の膨張 (パフォーマンス/メモリ コストの集中) を最小限に抑えるためのキャッシュ メカニズムを実装します。したがって、リストに表示されているのと同じ数 (またはそれ以上) の行しか作成されません。画像がある場合にのみ設定しますが、既に設定されている画像を行から削除しないため、画像を再生してはならない行がいくつか発生します。これらの行は、以前にアウトスクロールした行からキャッシュされます。

したがって、次のようなものを追加します

if (listItem.photo != null) {
  image.setImageResource(images[arg0]);
} else {
  image.setVisibility(View.GONE);
}

リストビューとそのキャッシュメカニズムのリファレンスとして、ListViews の Romain Guy を参照してください。

Edit Listadapterの使い方について

getView(..)上に投稿したものはListAdapter実装内にあり、できれば拡張したArrayAdapter<T>. もしそうなら、あなたTは今述べるべきでListEntryあり、あなたは述べているコード行を持っています

MyArrayAdapter myAdapter = new MyArrayAdapter()またはそのようなもの。

これで、ListEntry のような配列またはリストがList<ListEntry> myCollection = new ArrayList<ListEntry>()できListEntry[] listEntries = new ListEntry[10]ました。

myAdapter.addAll(listEntries);

リスト内のアイテムを取得するには、getView(..)次を使用できます。

ListEntry currentEntry = getItem(arg0);

currentEntry の単一メンバーを参照してそれらを設定します;-)

于 2013-07-25T02:30:03.917 に答える