2011-09-12 8 views
3

何らかの理由で、最初の画像が正しく表示され、別のユーザーの画像で上書きされてしまいます。任意のアイデア:最初のアダプターの画像が正しくない

public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     ViewHolder holder; 
     if(convertView == null){ 
       vi = inflater.inflate(R.layout.feed_item, null); 
       holder=new ViewHolder(); 
       holder.userImage = (ImageView) vi.findViewById(R.id.feed_userimage); 
       vi.setTag(holder); 
     } else { 
       holder=(ViewHolder)vi.getTag(); 
     } 
     if(user.has("image") && 
      user.getString("image") != null && 
      !user.getString("image").equals("null")) { 
       holder.userImage.setTag(user.getString("image")); 
       imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE); 
     } else { 
       holder.userImage.setImageDrawable(null); 
     } 
+1

なぜgetView()をカスタマイズしていますか? –

+0

少なくともgetViewコード全体を表示してください!私は最初の答えを入れますが、コード全体を表示してください –

+1

私たちは 'DisplayImage'メソッドを見てください。 – Ronnie

答えて

1

あなたがconvertViewを使用しているので、それがhappenningさ

if(user.has("image") && 
    user.getString("image") != null && 
    !user.getString("image").equals("null")) { 
    holder.userImage.setTag(user.getString("image")); 
    imageLoader.DisplayImage(user.getString("image"), act, holder.userImage,USER_IMAGE_SIZE); 
} else { 
    holder.userImage.setTag(null);//add this line 
    holder.userImage.setImageDrawable(null); 
} 
+0

申し訳ありませんが、正しい画像がまだ1秒間表示され、リストの残りの部分が別のユーザーの画像に置き換えられます。 – hunterp

+0

サンプルアプリケーションを使用しても同じ動作をしますか?そうでない場合は、コードとサンプルの違いを特定できますか? – Fedor

+0

私はあなたの1行の変更を加えましたが、それは動作しません – hunterp

1

を修正し、これを試してみてください。 getViewメソッドに渡されたconvertViewは、前のgetView呼び出し(これはもはや表示されないので、もはや必要ではありません)で作成したビュー・オブジェクトです(スクロールすることにより)。

getViewが呼び出されるたびに、新しいビューが作成され、実際に以前に作成されたビューを使用していると仮定しています。 convertViewは最適化として渡されるため、少数しか表示されていない場合には多くのビューを作成する必要はありません。 したがって、setTagコールは、実際に以前に作成されたビューのtagを上書きします。

tagsを使用せずにコードの書き換えを再考する必要があります。または、convertViewnullではない場合にのみ膨張させるのではなく、常にビューを膨張させることができます。しかし、私は長いリストのためにこのアプローチを推奨していませんが、それはメモリ内で不必要なビューが多すぎることを意味します。

+0

あなたが指定した理由は正しいです、原因はAndroidビューとgetview(0)がより頻繁に呼び出されるという事実をキャッシュしていることです。しかし、修正はまだ明らかではありません。まだそれを探しています。 – Nitin