標籤:
寫listview最佳化的時候,發現Listview初次建立的時候會多次執行getView方法。
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.hang.myapplication.MainActivity"> <ListView android:id="@+id/list_item1" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout>
這是listview的布局,執行後結果為:
06-30 20:04:14.094 1166-1166/com.example.hang.myapplication D/hello: convertView為空白006-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView為空白106-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView為空白206-30 20:04:14.114 1166-1166/com.example.hang.myapplication D/hello: convertView為空白306-30 20:15:31.944 13339-13339/com.example.hang.myapplication D/hello: convertView為空白006-30 20:15:31.944 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:31.954 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:15:31.984 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView為空白106-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView為空白206-30 20:15:31.994 13339-13339/com.example.hang.myapplication D/hello: convertView為空白306-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView為空白006-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:32.054 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:15:32.124 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:15:32.134 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白3
這顯然不正常,執行了多次getview方法。經過群友的提示修改為fill_partent後結果顯示正常。
06-30 20:04:14.094 1166-1166/com.example.hang.myapplication D/hello: convertView為空白006-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView為空白106-30 20:04:14.104 1166-1166/com.example.hang.myapplication D/hello: convertView為空白206-30 20:04:14.114 1166-1166/com.example.hang.myapplication D/hello: convertView為空白3
後來聯想到UI的最佳化,恍然大悟~
RelativeLayouts經常需要measure所有子節點兩次才能把子節點合理的布局。如果子節點設定了weights屬性,LinearLayouts也需要measure這些節點兩次,才能獲得精確的展示尺寸。
在UI布局最佳化中,推薦扁平式布局。也是因為view開始被measure時,該view所有的子view都會被重新layout,再把該view傳遞給它的父view,如此重複一直到最頂部的根view。layout完成之後,所有的view都被渲染到螢幕上,並不是只有使用者看得見的view才會被渲染,所有的view都會。這樣一個view會被多次measure。getiew也執行了多次。
後來我嵌套了一層RelativeLayout,執行後發現getview執行次數比不嵌套多了一次~,嵌套linearlayout是沒有任何變化的
06-30 20:25:18.314 13339-13339/com.example.hang.myapplication D/hello: convertView為空白006-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.324 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.334 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.344 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.344 13339-13339/com.example.hang.myapplication D/hello: convertView為空白106-30 20:25:18.354 13339-13339/com.example.hang.myapplication D/hello: convertView為空白206-30 20:25:18.354 13339-13339/com.example.hang.myapplication D/hello: convertView為空白306-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView為空白006-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.404 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白306-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白006-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白106-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白206-30 20:25:18.414 13339-13339/com.example.hang.myapplication D/hello: convertView不為空白3
解決方案,設定為fill_partent或者設定為固定的數值,最佳化UI布局。
Android LIstView初次建立getview方法執行多次問題