3

常に 7 つのアイコンを表示したい GridView があり、リクエストに応じて追加のアイコンを表示することもあります。最初は、追加のアイコンは表示されません。これは構造です:

0   1   2
3   4   5
6  [7]

すべてのアイコンが画面に収まるので、スクロールは必要ありません。各アイコンは、画像とテキストで構成されています。

このために、BaseAdapter を拡張する CustomAdapter があります。各アイコンのテキストと画像を設定する getView メソッドをオーバーライドしました。

public View getView(int position, View convertView, ViewGroup parent) {
    View v = null;

    if (convertView == null) {
        LayoutInflater li = ((Activity) context).getLayoutInflater();
        v = li.inflate(R.layout.icon, null);
    } else {
        v = convertView;
    }

    TextView tv = (TextView) v.findViewById(R.id.icon_textView);
    tv.setText(position);
    ImageView iv = (ImageView) v.findViewById(R.id.icon_ImageView);
    iv.setImageResource(imageResourcesArray[position]);

    if ((position == ADDITIONAL_ICON)) && !showAdditionalIcon) {
        v.setVisibility(View.INVISIBLE);
    }

    return v;
}

imageResourcesArray[]、画像リソースを含む整数の配列です。CustomAdapter のその他の関数と変数は次のとおりです。

public static final int ADDITIONAL_ICON = 7;
private boolean showAdditionalIcon = false;

public showAdditionalIcon(){
    this.showAdditionalIcon = true;
    notifyDataSetChanged();
    // notifyDataSetInvalidated();
}

public hideAdditionalIcon(){
    this.showAdditionalIcon = false;
    notifyDataSetChanged();
    // notifyDataSetInvalidated();
}

ClassA後で、Activity を拡張するクラス (たとえば)から CustomAdapter を作成して GridView に設定します。

    GridView grid = (GridView) findViewById(R.id.main_gridView);
    customAdapter = new CustomAdapter(this);
    grid.setAdapter(customAdapter);

私の問題は、いくつかの計算とサーバーへのリクエストの後、追加のアイコン (番号 7) を表示する必要がある場合に発生します。だから私は(から)呼び出すClassA

    customAdapter.showAdditionalIcon();

これで、追加のアイコンが表示されますが、最初のアイコンが消えます...使用しようとしましnotifyDataSetInvalidated()notifyDataSetChanged()が、両方とも同じ結果になりました。

もちろん、CustomAdapter許可された追加のアイコンを使用して新しいアイコンを生成することもできますが、それをしない方がよいでしょう...

前もって感謝します。

4

1 に答える 1

1

これがあなたの答えとしてカウントされるかどうかはわかりません。問題の根本は、使用しているconvertViewにあるようです。Androidのソースについてはあまり深く掘り下げていませんが、すべてのビューがすでに表示されていることは明らかであり、舞台裏で再利用するべきではないことは明らかですが、ビューがどのように再利用されるかについての保証はないと思います。

これは、このシナリオ全体を視覚化するときに位置7にリンクしたビューが、後で位置0で実際に再利用されることを意味します。コードはビューを明示的にリセットして表示しないため、ビューは可視性をINVISIBLEに設定して再利用されます。したがって、消える最初のアイテムの謎。

最も簡単な解決策は、View.VISIBLEに明示的に設定することにより、@Vinayが上記で提案したとおりにする必要があります。

if ((position == ADDITIONAL_ICON))) {
    if (!showAdditionalIcon)
        v.setVisibility(View.INVISIBLE);
    else
        v.setVisibility(View.VISIBLE);
}

これがお役に立てば幸いですが、Androidの専門家が、古いビューを再利用するというこのすべてが実際にどのように機能するかについて詳しく教えてくれることを本当に望んでいます。

于 2011-11-11T18:13:32.697 に答える