1. 程式人生 > >ListView的優化(多方面)

ListView的優化(多方面)

在網上看了許多關於ListView優化的文章,自己也碼了這麼長時間程式碼關於ListView的優化也有自己的一點心得,下面是我對ListView優化的一些見解。

為什麼要對ListView進行優化?

很多時候我們直接對ListView的介面卡進行編寫完成之後,執行程式,如果ListView中有很多item,你一直上下滑動的時候程式突然崩了,這就是因為你不停的滑動的時候,一直在Findviewbyid這樣就會一直耗費程式的記憶體,導致崩潰;

如何對ListView進行優化?

1.使用viewholder

class ViewHolder {
ImageView iv_item_jzw;

TextView tv_fireplace_name;
ImageView iv_item_jzw_next;
}

2.複用convertView

利用 convertView 來重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改變寬高,重用View可以減少重新分配快取造成的記憶體頻繁分配/回收;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();

 
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_xfroom, null);
holder.tv_fireplace_name = (TextView) convertView.findViewById(R.id.tv_fireplace_name);
holder.iv_item_jzw = (ImageView) convertView.findViewById(R.id.iv_item_xfs);
holder.iv_item_jzw_next = (ImageView) convertView.findViewById(R.id.iv_item_xfs_next);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

XFRoom temp = list.get(position);

holder.tv_fireplace_name.setText( temp.getXf_room_name());
if (position == 0) {
convertView.setBackgroundResource(R.drawable.list_item_top);
} else if (position == (list.size() - 1)) {
convertView.setBackgroundResource(R.drawable.list_item_bottom);
} else {
convertView.setBackgroundResource(R.drawable.list_item_def);
}
 
return convertView;
}

3.圖片的載入優化

如果ListView需要載入顯示網路圖片,我們儘量不要在ListView滑動的時候載入圖片,那樣會使ListView變得卡頓,所以我們需要在監聽器裡面監聽ListView的狀態,如果ListView滑動(SCROLL_STATE_TOUCH_SCROLL)或者被猛滑(SCROLL_STATE_FLING)的時候,停止載入圖片,如果沒有滑動(SCROLL_STATE_IDLE),則開始載入圖片。 

4.減少item view的佈局層級

這是所有layout都必須遵循的,佈局層級過深會直接導致View的測量與繪製浪費大量的時間。

其他
1、利用好 View Type,例如你的 ListView 中有幾個型別的 Item,需要給每個型別建立不同的 View,這樣有利於 ListView

的回收,當然型別不能太多

2、善用自定義 View,自定義 View 可以有效的減小 Layout 的層級,而且對繪製過程可以很好的控制;

3、儘量能保證 Adapter 的 hasStableIds() 返回 true,這樣在 notifyDataSetChanged() 的時候,如果 id 不變,ListView

將不會重新繪製這個 View,達到優化的目的;

4、每個Item 不能太高,特別是不要超過螢幕的高度,可以參考 Facebook 的優化方法,把特別複雜的 Item 分解成若干小

的 Item

5、ListView 中元素避免半透明 

6、使用 RecycleView 代替, ListView 每次更新資料都要 notifyDataSetChanged(),,RecycleView 在效能和可定製性上

都有很大的改善,推薦使用。