ListView的優化有用的ViewHolder來做緩存,ViewHolder會把圖像一起緩存掉,當再次調用getView的時候會直接拿出來用,如果沒有對View上的數據進行設置,就會顯示前面設置過值的界面,所以getView裏面需要進行resetViewHolder操作,就行界面上的數據都進行初始化,之後數據就不會錯亂了。
對於圖片錯位,如果沒有進行緩存的話上面的問題跟這個問題都不會出現,如果進行了異步加載的話,圖片錯位就是常見現象了。最簡單的解決方法就是網上說的,給 ImageView 設置一個 tag, 並預設一個圖片。再開始加載圖片,異步加載完圖片後進行tag檢查,如果還是當前設置的tag則進行相應的顯示。如果不是,則不顯示。下面給出關鍵代碼:
<span style="white-space:pre"> </span>// 給 ImageView 設置一個 tag
holder.img.setTag(imgUrl);
// 預設一個圖片
holder.img.setImageResource(R.drawable.ic_launcher);
if (imgUrl != null && !imgUrl.equals("")) {
Bitmap bitmap = imageLoader.loadImage(holder.img, imgUrl,
new ImageDownloadedCallBack() {
@Override
public void onImageDownloaded(ImageView imageView,
Bitmap bitmap) {
// 通過 tag 來防止圖片錯位
if (imageView.getTag() != null
&& imageView.getTag().equals(imgUrl)) {
imageView.setImageBitmap(bitmap);
}
}
});
if (bitmap != null) {
holder.img.setImageBitmap(bitmap);
}
}
這樣就解決了問題。