0

私のアプリは ListView を実装しています。リスト内の各項目には、写真とテキストが表示されます。どちらもインターネットからダウンロードします。イメージがダウンロードされたときに更新できるように、ListAdapter で指定された convertView に独自のカスタム クラスを提供したいと考えています。ただし、ビューの代替を提供する方法がまったくわかりません(ビューを拡張するサブクラスを作成しましたが、デフォルトのメソッドシグネチャを変更したとき

View getView(int position, View convertView, ViewGroup parent)

View getView(int position, MyViewClass convertView, ViewGroup parent)

コンパイルエラーになりました。

convertView に独自のクラスを提供するにはどうすればよいですか?

4

1 に答える 1

0
I would like to provide my own custom class for the convertView

アダプターに2 種類以上のビューがListView必要な場合は、アダプターgetViewTypeCount()getItemViewType. 最初のメソッドは、表示するビューのタイプの数を返します。2 番目のメソッドは、現在のアイテムの位置に必要なビューのタイプを返します。何かのようなもの:

abstract class MyListAdapter implements ListAdapter {

    /**
     * Set this up in your constructor
     * */
    private Context context;
    private static final int VIEW_TYPE_SUPERMAN = 1;
    private static final int VIEW_TYPE_BATMAN = 2;
    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        if(position % 2 == 0) { // your business logic
            return VIEW_TYPE_BATMAN;
        }
        return VIEW_TYPE_SUPERMAN;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int viewType = getItemViewType(position);
        if(convertView == null) {
            if(viewType == VIEW_TYPE_BATMAN) {
                convertView = LayoutInflater.from(context).inflate(resource_id_for_batman, parent);
            } else {
                convertView = LayoutInflater.from(context).inflate(resource_id_for_superman, parent);
            }
            // setup a ViewHolder pattern implementation
        } else {
            // get your ViewHolder from convertView
        }
        // update your views from ViewHolder
        return convertView;
    }
}

さらに読む: so that I can update it when an image has downloaded. このため、別個のビューとタイプを用意する必要はありません。画像がダウンロードされていない、画像のダウンロードに失敗した、ダウンロードが進行中、または画像がダウンロードされた場合にのみ、各項目について (その位置に基づいて) 知る必要があります。したがってViewHolder、この情報を追加してパターンを実装します。したがって、単一のビュー タイプがあり、それぞれの場合に何をすべきかを決定します (ダウンロードをトリガーする、キャッシュ/SD カードから画像を取得する、またはデフォルトの画像を表示する)。これをよりよく考えるには、アダプターの実装に別の構造が必要になると思いますがViewHolderViewHolderオブジェクトはリサイクルされたビューに関連付けられるため、そうではありません。

上記のコード (オーバーロードされた を追加するため) は、注釈View getView(int position, MyViewClass convertView, ViewGroup parent)がない限りコンパイルする必要があります。@Overrideアノテーションがないと、呼び出されないオーバーロードされたメソッドができます。

于 2013-07-26T10:03:01.697 に答える