国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android ListView常見的優化方式詳解

2019-10-23 19:45:04
字體:
來源:轉載
供稿:網友

ListView的優化

對于ListView來說,應該算是布局中幾種最常用的組件之一了,使用也十分方便,下面個大家介紹一下兩種常見的優化方式.

1.條目復用優化

  1. 其實listview的工作原理就是,listview在請求屏幕可見的item數時,convertView在getVIew中是null 的.
  2. 但是當屏幕向下滑動的時候(比如該屏幕尺寸可顯示7條teim),在item1被隱藏,此時出現item8時,covertView的值就不為null 了,因為item1去填充它.
  3. 而如果不做復用處理的話,item8 則會繼續去findviewById, 因此其實每個item里的View控件,竟然ID都是一樣的,那我們其實可以利用covertView的復用原理,來優化listview,從而避免OOM異常.

詳情見下圖:

總結: 通過對上圖的理解,那么我們得知listview的item是可以進行復用的,通過什么來復用?Android已經幫我們定義了一個方法getView(final int position, View convertView,ViewGroup parent) 里面的convertView 就是專門來處理復用的item的,因此我們只要對他處理就可以了.

2.優化findviewbyid

系統尋找子孩子id的方式: 從左向右,跟樹狀模式一樣.

每次尋找子孩子都消耗很多的資源,但是子孩子的id都是被創建出來的,

也就是是說他們是固定的,竟然如此那么我們就可以對他進行優化;

系統找R.id的模式見下圖:

總結: 通過對上圖的理解,那么我們得知findviewbyid(id) 的底層操作太耗時了,如果一個布局里面有一百多層,那么我就單單是找一個小小的'ImageView' 都會找半天.幸好在2009年的google IO大會上,google的工程師推出了一個優化的方式 通過自定義一個viewholder類,來對view的id進行綁定,從而減少系統查找這樣的耗時操作.

兩種優化方案實際代碼如下:

/** * @param position 位置    * @param convertview 復用view * 歷史回收的view對象. 當某個view對象被完全移除屏幕的時候  * 1. 盡量的復用converview(歷史緩存的view),減少view對象創建的個數  * 2. 盡量的減少子孩子id的查詢次數 . 定義一個viewholder */@Overridepublic View getView(final int position, View convertView,    ViewGroup parent) {  View view;  ViewHolder holder;  if (convertView != null) {    // 復用歷史view對象    view = convertView;    holder = (ViewHolder) view.getTag();  } else {    // 創建新的view對象    view = View.inflate(getApplicationContext(),        R.layout.item_callsmssafe, null);    // 每次尋找子孩子消耗很多的資源cpu 內存.    // 只有當子view對象第一次被創建的時候 查詢id    holder = new ViewHolder();    holder.tv_mode = (TextView) view        .findViewById(R.id.tv_black_mode);    holder.tv_phone = (TextView) view        .findViewById(R.id.tv_black_phone);    holder.iv_delete_blacknumber = (ImageView) view        .findViewById(R.id.iv_delete_blacknumber);    view.setTag(holder);}/** * 子孩子id的容器*/static class ViewHolder {  TextView tv_phone;  TextView tv_mode;  ImageView iv_delete_blacknumber;}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌平区| 托克托县| 乡城县| 马边| 兰考县| 长子县| 克东县| 溧阳市| 和龙市| 新宁县| 平阳县| 淮南市| 兴安盟| 自贡市| 巴东县| 辽宁省| 昌宁县| 胶南市| 仪陇县| 福建省| 哈密市| 沂源县| 林州市| 丁青县| 怀安县| 壶关县| 区。| 佛山市| 册亨县| 巨野县| 偏关县| 尖扎县| 荔浦县| 祁东县| 屏东市| 宁夏| 阿克苏市| 苍梧县| 茌平县| 建德市| 四子王旗|