在getView()
方法中,每次都將佈局從新加載了一遍,當ListView快速滾動的時候,這就會成爲性能的瓶頸。緩存
getView()
方法中還有一個convertView
參數,這個參數用於將以前加載好的佈局進行緩存,以便以後能夠進行重用。ide
所以咱們能夠經過他來進行優化:佈局
@Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); View view; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); } else { view = convertView; } 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()); return view; }
不過,目前咱們的這份代碼仍是能夠繼續優化的,雖然如今已經不會再重複去加載佈局,可是每次在getView()
方法中仍是會調用View
的findViewById()
方法來獲取一次控件的實例。咱們能夠藉助一個ViewHolder
來對這部分性能進行優化:性能
@Override public View getView(int position, View convertView, ViewGroup parent) { Fruit fruit = getItem(position); View view; ViewHolder viewHolder; if (convertView == null) { view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false); 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()); return view; } class ViewHolder { ImageView fruitImage; TextView fruitName; }