ListView 緩存機制

    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