ListView优化方案及其原理
1、重用ConvertView
ListView的View回收機制:在可視范圍上面或者下面的View加入到回收池中。當在可視范圍內的View被移出可視范圍內時,其也會被添加到回收池中。以這種方式ListView只需占用非常少的內存,可以存儲可視范圍內的View和回收池中的View。
參數convertView實際上就是一個可回收的View。當ListView要回收這個View的時候,它的數據就會被清空。因此,當convertView不為null的時候,只需要將數據填充到里面,而不用Inflate一個新的View,這樣可以優化性能。因為,Layout的Inflate是消耗資源巨大的代碼,因為Infalte操作需要徹底包含整個XML代碼樹,而且還要實例化相應的View。
public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);}TextView text = (TextView) convertView.findViewById(R.id.text);text.setText("Position " + position);return convertView;}2、使用ViewHolder
ViewHolder就是用來存儲那些在你的getView()方法中調用findViewById()方法得到的View。以這種方式,你只需要在第一次創建Item的時候調用findViewById就可以了。
public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {convertView = mInflater.inflate(R.layout.your_layout, null);holder = new ViewHolder();holder.text = (TextView) convertView.findViewById(R.id.text);convertView.setTag(holder);} else {holder = convertView.getTag();}holder.text.setText("Position " + position);return convertView;}private static class ViewHolder {public TextView text;}}3、異步加載
加載圖片是一個比較耗時的操作,當用戶快速滑動列表時,會頻繁地 getView ,而 getView 是在主線程中被調用的,如果你在 getView 方法中直接加載 Image 或做其他耗時操作,就會造成滑動比較卡,解決方法是使用異步加載。
ListView加載圖片亂序問題的解決方法:
- getView中setTag,可以是圖片的url等唯一標識
- 異步加載后,為ImageView設置圖片之前,用findVIewWithTag查找tag是不是為null,不是null才設置圖片
4、其他優化方法:
但是這種寫法每次調用getView時都設置了一個新的onClick事件,都需要new 監聽器,效率很低。高效的寫法可以直接在ViewHolder中設置一個position,然后viewHolder implements OnClickListenr:
class ViewHolder implements OnClickListener{int position;TextView name;public void setPosition(int position){this.position = position;}@Overridepublic void onClick(View v) {switch (v.getId()){//XXXX}} }public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = inflater.inflate(R.layout.list_item, parent, false);holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.name.setOnClickListener(holder);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}//設置holderholder.name.setText(list.get(position).partname);//設置positionholder.setPosition(position);return convertView; }總結
以上是生活随笔為你收集整理的ListView优化方案及其原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝开放接口api分享
- 下一篇: 触发器实例