提高ListView執行效率
阿新 • • 發佈:2018-12-13
提高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()方法來獲取控制元件例項了。