2017-02-25 14 views
0

ImageViewがListViewにあり、ImageViewにデフォルトの画像があり、レンダリング中に画像を非同期にダウンロードしてImageViewsにロードします。それは完全に動作しますが、2つのアイテムをスクロールしてスクロールバックすると、最初と2番目の行のデフォルトイメージが6番目と7番目の行のイメージに変わります。AndroidでスクロールしながらListViewで画像が変化しています

これらのトピックを読みましたが、解決策が見つかりませんでした。

ListView images changing During Scroll

public class RssAdapter extends BaseAdapter { 

private final List<SyndEntry> items; 
private static Context context; 
private static Map<String, Bitmap> mBitmapCache = new HashMap<String, Bitmap>(); 

public RssAdapter(Context context, List<SyndEntry> items) { 
    this.items = items; 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int id) { 
    return id; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 
    if (convertView == null) { 
     convertView = View.inflate(context, R.layout.rss_item, null); 
     holder.itemTitle = (TextView) convertView.findViewById(R.id.itemTitle); 
     holder.itemPubDate = (TextView) convertView.findViewById(R.id.itemPubDate); 
     holder.itemImg = (ImageView) convertView.findViewById(R.id.itemImg); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.itemTitle.setText(items.get(position).getTitle()); 
    holder.itemPubDate.setText(items.get(position).getPublishedDate().toString()); 

    List<SyndEnclosure> encls = items.get(position).getEnclosures(); 
    if(!encls.isEmpty()){ 
     holder.imageUrl = encls.get(0).getUrl(); 
    } 

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) { 
     holder.setImage(holder.imageUrl); 
    } 

    return convertView; 
} 

private static class ViewHolder { 
    TextView itemTitle; 
    TextView itemPubDate; 
    ImageView itemImg; 
    String imageUrl; 

    public void setImage(String imageUrl) { 
     this.imageUrl = imageUrl; 
     Bitmap imageBitmap = mBitmapCache.get(imageUrl); 
     if(imageBitmap!=null){ 
      itemImg.setImageBitmap(imageBitmap); 
     } else { 
      AsyncHttpClient client = new AsyncHttpClient(); 
      client.get(imageUrl, null, fileHandler); 
     } 
    } 

    FileAsyncHttpResponseHandler fileHandler = new FileAsyncHttpResponseHandler(context) { 

     @Override 
     public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) { 

     } 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, File response) { 
      Bitmap imageBitmap = BitmapFactory.decodeFile(response.getPath()); 
      itemImg.setImageBitmap(imageBitmap); 
      mBitmapCache.put(imageUrl, imageBitmap); 
     } 
    }; 
} 

Image change when i scroll gridview

My images changing during scroll in listview android

は、私は私のイメージが設定されたかどうかを確認するためのブール変数を設定しようとしたともSharedPreferencesを使用しようとしましたが、この部分の私の画像が変化したときにコードが実行されませんでした。

if(!encls.isEmpty()){ 
     holder.imageUrl = encls.get(0).getUrl(); 
    } 

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) { 
     holder.setImage(holder.imageUrl); 
    } 
+0

あなたは私はあなたがライブラリ(ピカソやグライド)を使用することをお勧め強くなり、生産のためにそれを実装する必要がある場合 – lelloman

+0

は、このリンクをクリックしてください。この意志作品[このリンクを参照してください]( http://stackoverflow.com/questions/36563923/my-images-changing-during-scroll-in-listview-android) –

+0

@MilanPansuriyaありがとう、私は前にそれを読んだが、助けなかった。 – user1721713

答えて

0

私はこの問題を最終的に解決したようですが、私は将来解決策を投稿します。だから、コード

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

のこの部分でholderオブジェクトは、所与の行で描画されなければならないものではありません。したがって、必要な値に対してholderオブジェクトのパラメータを設定する必要があります。それは問題ありませんでしたが、イメージがない場合は、イメージ関連のパラメータをnullに設定しませんでした。だから、2つの他の部分が欠落していた:

if(!encls.isEmpty()){ 
     holder.imageUrl = encls.get(0).getUrl(); 
    } else { 
     holder.imageUrl = null; 
    } 

    if (!encls.isEmpty() && holder.imageUrl != null && !holder.imageUrl.equals("null")) { 
     holder.setImage(holder.imageUrl); 
    } else { 
     holder.itemImg.setImageResource(R.mipmap.news_icon); 
    } 
関連する問題