Adapter是Listview與數據之間的橋樑,每當列表裏有一項時,就要調用Adapter的getView()方法建立一個View。那麼應對較少的數據時,這是徹底ok的,不會有什麼問題,可是若是面對數據量很大的時候,對於每一條的建立view是很佔用系統資源的,因此採用性能優化的方法。java
那麼,瞭解了ListView的工做原理,咱們來看一下ListView的緩存機制。緩存
1)當數據量很大時,可見的項存放在內存中,其餘的存放在Recycler中。性能優化
2)Listview經過getView()請求一個View,而後請求其餘可見的View,這個時候,convertView在getView()時是空的。ide
3)當列表項中的第一項滾出屏幕,而且有數據從低端上來時,ListView 會再請求View,這時的convertView已經不在是空了,而是滾出屏幕的第一項,這時就不用建立View對象了,而要直接爲其直接設定新值就能夠了,這樣就能夠節省系統資源了。性能
自定義Adapter,使用緩存原理。優化
public class MyAdapter extends BaseAdapter{ private Context context; private String[] data; private int[] p_w_picpaths; public MyAdapter(Context context, String[] data,int[] p_w_picpaths){ this.context=context; this.data=data; this.p_w_picpaths=p_w_picpaths; } @Override public int getCount() { return data.length; } @Override public Object getItem(int position) { return data[position]; } @Override public long getItemId(int position) { return position; }
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView=LayoutInflater.from(context).inflate(R.layout.items, null); holder=new ViewHolder(); holder.iv=(ImageView) convertView.findViewById(R.id.adapter_iv); holder.tv=(TextView) convertView.findViewById(R.id.adapter_tv); convertView.setTag(holder); }else{ holder=(ViewHolder) convertView.getTag(); } holder.iv.setBackgroundResource(p_w_picpaths[position]); holder.tv.setText(data[position]); return convertView; } //存儲一個View private static class ViewHolder{ ImageView iv; TextView tv; } }
在使用上是同樣的,因爲今天的主題不是它,這裏就不介紹了。好了,就說這些,但願會對你理解ListView的緩存機制有幫助。this