我使用GridView
來顯示ImageView
的列表。圖像通過ImageLoader庫從Internet加載。我也實現了自定義適配器(延伸BaseAdapter
):使用ImageLoader庫時GridView中的重複項目
public class ImagePreviewAdapter extends BaseAdapter {
private Context mContext;
private List<LastPost> mPosts = new ArrayList<LastPost>();
private ImageLoader mImageLoader;
private ImageLoadingListener mLoadingListener;
public ImagePreviewAdapter(Context context, List<LastPost> posts, ImageLoadingListener listener) {
this.mContext = context;
this.mPosts = posts;
this.mLoadingListener = listener;
Activity activity = (Activity)mContext;
this.mImageLoader = ((MeanwhileInRussia)activity.getApplication()).getImageLoader();
}
public int getCount() {
return mPosts.size();
}
public LastPost getItem(int position) {
return mPosts.get(position);
}
public long getItemId(int position) {
LastPost post = mPosts.get(position);
return Long.parseLong(post.getId());
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
// if it's not recycled, initialize some attributes
if (convertView == null) {
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(125, 125));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(0, 0, 0, 0);
String imageLink = mPosts.get(position).getImageurl();
DisplayImageOptions displayImgOptions = ImageLoaderConfigUtil
.getDisplayImageOptions(mContext);
if (mLoadingListener != null) {
mImageLoader
.displayImage(imageLink, imageView, displayImgOptions, mLoadingListener);
} else {
mImageLoader.displayImage(imageLink, imageView, displayImgOptions);
}
} else {
ImageView restoringView = (ImageView)convertView;
imageView = restoringView;
}
return imageView;
}
}
時系統調用getView()
方法創建一個新的ImageView
對象,並要求ImageLoader的把圖像在它每次(如果convertView ==當然空) 。對於URL的第一部分,一切正常。但我的問題從第二部分開始:GridView
中沒有新圖像,只是第一部分的副本...我意識到這個問題隱藏在convertView == null
的某處:對於理論上所有新元素,這種檢查總是等於FALSE!而不是創建新的對象並從URL加載圖像,我的代碼將一些舊對象放到新的位置。有趣的事實:getItemId(position)
方法返回我的LastPost對象的正確ID。這是否意味着我只是在正確的LastPosts對象的適配器中有不正確的視圖?
有什麼建議嗎?謝謝!
謝謝,希瓦吉!它的工作原理:) – fraggjkee
如何訪問imageLink在該位置,因爲它被包含在第一個條件 –
什麼是同時InRussia?在這一行this.mImageLoader =((AlongInRussia)activity.getApplication())。getImageLoader(); –