1. 程式人生 > >提高ListView執行效率

提高ListView執行效率

提高ListView的執行效率:

                                                         ——整理自《第一行程式碼》

1.getView()方法中還有一個 convertView 引數,這個引數用於將之前載入好的佈局進行快取,以便之後可以進行重用

View view;

    if (convertView == null) {

      view = LayoutInflater.from(getContext()).inflate(resourceId, null);

    } else {

      view = convertView;

    }

getView()方法中進行了判斷,如果 convertView 為空,則使用LayoutInflater 去載入佈局,如果不為空則直接對 convertView進行重用。這樣就大大提高了ListView的執行效率,在快速滾動的時候也可以表現出更好的效能

2.每次在getView()方法中還是會呼叫View的findViewById()方法來獲取一次控制元件的例項。我們可以藉助一個 ViewHolder來對這部分效能進行優化

class ViewHolder {

    ImageView fruitImage;

    TextView fruitName;

  }

View view;

    ViewHolder viewHolder;

    if (convertView == null) {

      view = LayoutInflater.from(getContext()).inflate(resourceId, null);

      viewHolder = new ViewHolder();

      viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);

      viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);

      view.setTag(viewHolder); // 將ViewHolder 儲存在View 中

    } else {

      view = convertView;

      viewHolder = (ViewHolder) view.getTag(); // 重新獲取ViewHolder

    }

    viewHolder.fruitImage.setImageResource(fruit.getImageId());

    viewHolder.fruitName.setText(fruit.getName());

新增了一個內部類 ViewHolder,用於對控制元件的例項進行快取。

當 convertView為空的時候,建立一個 ViewHolder物件,並將控制元件的例項都存放在 ViewHolder 裡,然後呼叫 View的 setTag()方法,將 ViewHolder 物件儲存在 View 中。

當 convertView 不為空的時候則呼叫View的 getTag()方法,把 ViewHolder 重新取出。這樣所有控制元件的例項都快取在了 ViewHolder裡,就沒有必要每次都通過 findViewById()方法來獲取控制元件例項了。