9

カスタム配列アダプターの getView メソッドでのビューのリサイクルに関して、不明な問題があります。

要素が再利用されることは理解していますが、if ステートメントの最初の部分で何を実装し、2 番目の部分で何を実装するかを正確に知るにはどうすればよいでしょうか?

現在、次のコードがあります。この質問にたどり着いたのは、ステートメントの 2 番目の部分にコードをドロップすると、最初の 9 つの要素のリストになり、すべての要素ではなく何度も繰り返されるためです。正確には何が原因なのかわかりませんでした...

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            title = getItem(position).getTitle();
            size = calculateFileSize(position);

            txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            tvFileSize = (TextView) row.findViewById(R.id.tvFileSize);

            txtTitle.setText(title);
            tvFileSize.setText(size);

        } else {

            title = getItem(position).getTitle();
            size = calculateFileSize(position);

            txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            tvFileSize = (TextView) row.findViewById(R.id.tvFileSize);

            txtTitle.setText(title);
            tvFileSize.setText(size);
        }

        return row;
    } 
4

5 に答える 5

14

それは簡単です。初めて行が作成されないため、それらを膨らませる必要があります。その後、Android OS は、すでに膨張していて表示されなくなったビューをリサイクルすることを決定する場合があります。これらはすでにインフレートされ、convertView パラメーターに渡されているため、新しい現在のアイテムを表示するように配置するだけです。たとえば、適切な値をさまざまなテキスト フィールドに配置します。

ここに画像の説明を入力

つまり、最初の部分ではインフレーションを実行して値を入力する必要があり、2 番目の if ( if convertView != null) では、フィールドを上書きするだけで済みます。これは、ビューがリサイクルされているため、テキストビューには古いアイテムの値が含まれているためです。

この投稿これは良い出発点です

于 2013-04-09T21:41:20.103 に答える