1

私はすでにSOを検索し、4つの同様の質問を見つけましたが、この問題は別の種類のようです. また、この 1 つのバグを解決するのに約 7 時間を費やしましたが、どこが間違っていたのかわかりませんでした。

問題:
ListView のすべての行に 2 つの画像が含まれています。アクティビティを起動すると、最初の行の imageView の一方または両方が間違った画像を表示し、これは起動後に発生することがあります。場合によっては、起動後に正しい画像を表示する行。

下にスクロールして最初の行を非表示にしてからもう一度上にスクロールすると、画像が正しい画像に変わります。

試した解決策: getView
メソッドの先頭で convertView = null を設定するという解決策が 1 つしか見つかりませんでした。はい、動作します。imageView は正しく表示されますが、他の問題やバグにつながります。スクロールがスムーズにいかず、一部の画像が本来のサイズよりも小さすぎる場合がありました。

注:
デバッグを実行した後、データ、すべての行に対して正しくデータをフェッチすることに問題はありません。

マイコード
MatchAdapter.class getView メソッド

public View getView(int position, View convertView, ViewGroup parent) {
    Match entry = listMatch.get(position);

    MatchAdapter.ViewHolder myViewHolder;

    if(convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.match_row, parent, false);

        myViewHolder = new MatchAdapter.ViewHolder();

        myViewHolder.home_team_name = (TextView) convertView.findViewById(R.id.home_team_name);
        myViewHolder.away_team_name = (TextView) convertView.findViewById(R.id.away_team_name);
        myViewHolder.home_logo_view = (ImageView) convertView.findViewById(R.id.home_team_logo);
        myViewHolder.away_logo_view = (ImageView) convertView.findViewById(R.id.away_team_logo);
        myViewHolder.venue = (TextView) convertView.findViewById(R.id.venue);
        myViewHolder.time = (TextView) convertView.findViewById(R.id.time);
        convertView.setTag(myViewHolder); 

    } else {
        myViewHolder = (ViewHolder) convertView.getTag(); 
    }

    ImageLoader imageLoader = new ImageLoader(this.context, "com.myapps", R.drawable.team_logo);

    imageLoader.DisplayImage("http://myapps.com/assets/images/logos/"+ entry.getHome_team_logo(), 
            myViewHolder.home_logo_view);
    imageLoader.DisplayImage("http://myapps.com/assets/images/logos/" + entry.getAway_team_logo(), 
            myViewHolder.away_logo_view); 

    myViewHolder.home_team_name.setText(entry.getHome_team_name());
    myViewHolder.away_team_name.setText(entry.getAway_team_name());
    myViewHolder.venue.setText(entry.getVenue());
    myViewHolder.time.setText(entry.getTime());

    return convertView;
}

その他の関連コード:

ImageLoader.class (この質問が長すぎてスクロールできないようにしたくない)

ご協力ありがとうございました!

4

2 に答える 2

0

問題が解決しました!lazylist を使用してコード全体を再設計します。次の例は fedor LazyListの簡単なデモです。

ここから見つけました ListViewで画像の遅延読み込みを行うにはどうすればよいですか


于 2013-03-15T19:34:11.190 に答える
0

私の推測では、次のコードは

マッチ エントリ = listMatch.get(position);

早すぎる。ListView の getView はマルチスレッド化されており、レイアウトを拡張してビューを変換するには時間がかかります。そして、どういうわけか変数参照が正しくなくなりました。

Call Match エントリ = listMatch.get(position); 後

else { myViewHolder = (ViewHolder) convertView.getTag(); }

于 2013-03-15T07:44:04.747 に答える