2

この質問と同様の問題があります: ListView と行のリサイクルの問題

以上で解決です。しかし、同じ解決策は私にはうまくいきません。

テキストビューで構成されるリストビューがあります。各テキストビューには、可変数の画像を含めることができます。html.imagegetter で画像を取得しており、リスト アダプターの getview メソッドでリサイクルを使用しています。

テキストビューに 1 つまたは複数の画像がある場合、そのコンテンツに合わせて高さが設定されます。このテキストビューが再利用され、新しいコンテンツが以前に定義された高さを満たさない場合、空のスペースが表示されます。

問題は、次のリスト項目の高さが分からないため、getview で textview の高さを復元できないことです。

これは私のgetviewです:

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;

    View rowView = convertView;
    if (rowView == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(resource, parent, false);
        holder = new ViewHolder();
        holder.imgAvatar = (ImageView) rowView.findViewById(R.id.imgAvatar);
        holder.textDetails = (TextView) rowView.findViewById(R.id.textDetails);
        holder.textPostTime = (TextView) rowView.findViewById(R.id.textPostTime);
        holder.textPost = (TextView) rowView.findViewById(R.id.textPost);
        rowView.setTag(holder);
    } else {
        holder = (ViewHolder) rowView.getTag();
    }

    holder.textDetails.setText(details.toString());
    holder.textPostTime.setText(x.postTime);
    holder.textPost.setText(Html.fromHtml(x.postBody, new URLImageGetter(holder.textPost, context), null, context));
    return rowView;
}

これは行のレイアウトです:

<TextView
    android:ellipsize="none"
    android:autoLink="web"
    android:textColor="#000000"
    android:id="@+id/textPost"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

問題:リストビューのリサイクル メカニズムは、使用されているビューの新しいコンテンツに応じて新しい高さを計算できません。リサイクルがなければ、遅すぎます。

4

2 に答える 2

2

したがって、基本的にあなたの問題はビューのリサイクルにあります。ビューが XML から膨張すると、ビューは画像を見て高さを決定します。インフレータは高さを「wrap_content」にすることができるため、これは正常に機能します。これは、最も高い子コンポーネントの高さに関係なく、動的です。

ただし、getview が古いビューをリサイクルすると、(何らかの理由で) 行の高さが更新されません。あなたが説明したことから、ビューの高さがたまたま以前に設定されていた行を取得するだけのように見えます(この以前の値はインフレータによって自動的に設定されました)。

あなたの2つの解決策は次のとおりです。

  1. ビューをリサイクルしないでください- 毎回新しいものを膨らませてください。おそらく 50 個以上の要素を持つリストでのみ顕著になるパフォーマンス ヒットが見られます。リストが小さい場合は、これが (コード的に) 最も簡単なオプションかもしれませんが、それでも動作は少し遅くなります。
  2. ビューのリサイクルを続けます。これを選択すると、画像の高さに基づいて、行 (またはテキスト ビューなど、それを決定するもの)の高さを自分で設定する必要があります。これは実行可能ですが、さらに作業が必要になります。私は提案します
  3. 秘密のオプション 3 - 画像の高さを正規化する- a . )ビューのリサイクルを続けたいが、b.)行の高さを手動で設定するコードを書きたくない、c.)画像のサイズを変更してもあなたのアプリでは、 setMaxHeight(int) メソッドを使用して、すべての画像が同じ高さであることを確認できます (または、このようなメソッドを使用して、画像を所定のサイズにサイズ変更します)。

注:通常、高さが「wrap_content」に設定されている場合、新しいコンテンツサイズにラップされることはほぼ確実です(通常、コンテンツが更新されるとサイズが更新されるため)。なぜこれが起こっていないのかわかりませんでした.「wrap_content」内の何かのサイズが具体的な値に設定されているため、サイズが変更されていない可能性があります。空きスペースです。

于 2012-06-18T22:22:59.523 に答える