先簡述下使用場景:listview使用的頻率之高簡直貫穿整個android開發(fā),因此對于listview復(fù)用的優(yōu)化在近幾年也是出現(xiàn)了比較多的思路
1鸳玩,首先是不復(fù)用,這個不用說了演闭,直接在adapter的convertview直接寫就好了
2不跟,之后發(fā)現(xiàn)不復(fù)用的話,數(shù)據(jù)大的情況下米碰,listview直接造成OOM(內(nèi)存爆炸)窝革,后來出現(xiàn)了if(convertview == null){...}這一種復(fù)用
3,再之后就是谷歌爸爸在某一年io大會上推出的viewholder和新的api(settag)(據(jù)說是某一位谷歌員工寫來自己玩的吕座,后來給項目老大發(fā)現(xiàn)虐译,結(jié)果悲劇了)
4,使用了viewholder之后吴趴,listview就變得十分流暢漆诽,但是出現(xiàn)一個問題就是:如果每一個條目都可以操作(例如:EditText,甚至自己做的一些狀態(tài)選擇器锣枝,操作之后發(fā)現(xiàn)復(fù)用的過程中出現(xiàn)問題)。這個在實際的開發(fā)過程中,我做出了如下處理:使用一個集合寞射,儲存標(biāo)記位(boolean類型的flag值)劲藐,復(fù)用的過程中,添加if語句判斷(if(list.get(position).getFlag( ))),根據(jù)這個flag進(jìn)行判斷用戶之前是否操作過該條目---------之后陨闹,在閱讀一些技術(shù)大牛的博客以及大型項目代碼的過程中楞捂,我發(fā)現(xiàn)也是很多人這樣處理去避免復(fù)用的問題
5薄坏,(這個是我閱讀了xiaanming大牛的博客之后,才萌發(fā)了強烈的總結(jié)listview復(fù)用的心理)
public class NewsAdapter extends BaseAdapter {
// 定義Context private
Context mContext;
List<NewsListBean> list = new ArrayList<>();
//定義hashMap 用來存放之前創(chuàng)建的每一項item
HashMap<Integer, View> lmap = new HashMap<Integer, View>();
private ImageLoader imageLoader = ImageLoader.getInstance();
public NewsAdapter(Context context, List<NewsListBean> listViewList) {
this.mContext = context;
this.list = listViewList;
}
@Override
public int getCount() {
return list.size();
}
@Override public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder ViewHolder;
//創(chuàng)建每一個滑動出來的item項寨闹,將創(chuàng)建出來的項胶坠,放入數(shù)組中,為下次復(fù)用使用
if (lmap.get(position) == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.news_item, null);
ViewHolder = new ViewHolder(convertView);
convertView.setTag(ViewHolder); lmap.put(position,convertView);
} else {
convertView = lmap.get(position);
ViewHolder = (ViewHolder) convertView.getTag();
}
ViewHolder.tv_newstime.setText(list.get(position).getDate());
ViewHolder.tvnewsneirong.setText(list.get(position).getContent());
ViewHolder.tvnewstitle.setText(list.get(position).getTitle());
imageLoader.displayImage(list.get(position).getImg(), ViewHolder.imgnewspic,
Tools.setBeforImageoption());
return convertView;
}
//添加viewHolder
class ViewHolder {
TextView tvnewstitle,newstype,tvnewsneirong,tv_newstime;
ImageView imgnewspic;
public ViewHolder(View convertView) {
tvnewstitle = (TextView) convertView.findViewById(R.id.tvnewtitle);
imgnewspic = (ImageView) convertView.findViewById(R.id.imgnewspic);
newstype= (TextView) convertView.findViewById(R.id.newstype);
tvnewsneirong= (TextView) convertView.findViewById(R.id.tvnewsneirong);
tv_newstime= (TextView) convertView.findViewById(R.id.tv_newstime);
}
}
原理就是鼻忠,用HashMap<Integer,View>儲存convertView涵但。
代碼還可以優(yōu)化,狀態(tài)也同時放入tag中做保存帖蔓,同樣在實現(xiàn)復(fù)用的時候復(fù)用狀態(tài)矮瘟。