1.理解ListView及GridView视图复用的机制Adapter+静态ViewHolder的方式可以参照
http://www.myandroidsolutions.com/2012/07/19/android-listview-with-viewholder-tutorial/
2.GridView防止内存溢出问题实现的视图复用的方法,只创建当前屏幕所显示的几条内容View,不会为每条内容都创建视图
在定义ViewHolder时多添加一个参数tag
public static class ViewHolder{
ImageViewmagazine_item_foreground_image;
ImageViewmagazine_item_free_image;
ImageViewmagazine_item_image;
TextViewcolumnName;
Stringtag;
}
在自定义BaseAdapter类中自定义Adapter中执行getView方法返回视图为ViewHolder中的tag指定唯一标识值
@Override
public View getView(int position, ViewconvertView, ViewGroup parent) {
columnView.tag = period(杂志id);
return convertView;
}
在更新GridView时,获取GridView上显示的复用视图,判断更新的杂志period是否与上边为ViewHolder设置tag值一样,若是同一本杂志的id,则更新ViewHolder中缓存的视图
/**
* 更新某一条内容
* @param period //杂志id
* @param periodName //杂志名称
*/
publicvoid updateMagazineItem(String period, String periodName){
//获取GridView复用的视图
for(inti=0; i<mGridView.getChildCount(); i++){
//判断View上缓存设置的ViewHolder的tag是否和需要更新的杂志id一样
if(((ViewHolder)mGridView.getChildAt(i).getTag()).tag.equals(period)){
//更新需要更新的View
if(Constants.downloadingmagazines.get(period)!= null){
((ViewHolder)mGridView.getChildAt(i).getTag()).columnName.setText(R.string.downloading);
}else{
((ViewHolder)mGridView.getChildAt(i).getTag()).columnName.setText(periodName);
}
}
}
}
在视图上只需要更新GridView中的几条显示的内容View,所以通过循环判断也不会太耗时,直接在UI线程处理即可