標籤:ima textview androi listview getview font getname justify imageview
之所以說 ListView 這個控制項很難用,就是因為它有很多的細節可以最佳化,其中運行效率就是很重要的一點。目前我們ListView 的運行效率是很低的,因為在 FruitAdapter 的getView()方法中每次都將布局重新載入了一遍,當 ListView 快速滾動的時候這就會成為效能的瓶頸。
仔細觀察,getView()方法中還有一個 convertView 參數,這個參數用於將之前載入好的布局進行緩衝,以便之後可以進行重用。修改 FruitAdapter 中的代碼,如下所示:
1 public class FruitAdapter extends ArrayAdapter<Fruit> { 2 3 …… 4 5 @Override 6 7 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); 8 9 View view;10 11 if (convertView == null) {12 13 view = LayoutInflater.from(getContext()).inflate(resourceId, null); } else {14 view = convertView;15 16 }17 18 ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image); TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); fruitImage.setImageResource(fruit.getImageId()); fruitName.setText(fruit.getName());19 20 return view;21 22 }23 24 }
可以看到,現在我們在 getView()方法中進行了判斷,如果 convertView 為空白,則使用 LayoutInflater 去載入布局,如果不為空白則直接對 convertView 進行重用。這樣就大大提高了 ListView 的運行效率,在快速滾動的時候也可以表現出更好的效能。
不過,目前我們的這份代碼還是可以繼續最佳化的,雖然現在已經不會再重複去載入布局,但是每次在getView()方法中還是會調用View 的findViewById()方法來擷取一次控制項的執行個體。我們可以藉助一個 ViewHolder 來對這部分效能進行最佳化,修改 FruitAdapter 中的代碼,如下所示:
1 public class FruitAdapter extends ArrayAdapter<Fruit> { 2 3 …… 4 5 @Override 6 7 public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); 8 9 View view;10 11 ViewHolder viewHolder;12 13 if (convertView == null) {14 15 view = LayoutInflater.from(getContext()).inflate(resourceId, null); viewHolder = new ViewHolder();16 17 viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);18 19 viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);20 21 view.setTag(viewHolder); // 將ViewHolder儲存在View中22 23 } else {24 25 view = convertView;26 27 viewHolder = (ViewHolder) view.getTag(); // 重新擷取ViewHolder28 29 }30 31 viewHolder.fruitImage.setImageResource(fruit.getImageId());32 33 viewHolder.fruitName.setText(fruit.getName()); return view;
我們新增了一個內部類 ViewHolder,用於對控制項的執行個體進行緩衝。當 convertView 為空白的時候,建立一個 ViewHolder 對象,並將控制項的執行個體都存放在 ViewHolder 裡,然後調用 View的 setTag()方法,將 ViewHolder Object Storage Service在 View 中。當 convertView 不為空白的時候則調用 View 的 getTag()方法,把 ViewHolder 重新取出。這樣所有控制項的執行個體都緩衝在了 ViewHolder裡,就沒有必要每次都通過 findViewById()方法來擷取控制項執行個體了。
通過這兩步的最佳化之後,我們 ListView 的運行效率就已經非常不錯了。
參考:《第一行代碼Android》
資源:http://download.csdn.net/detail/u011457627/8697337
Android——提升ListView的運行效率