標籤:最佳化 viewholder listview
轉載請註明出處:http://blog.csdn.net/zhaokaiqiang1992
現在大家都知道用ViewHolder來實現listview的最佳化了,但是,ViewHolder到底要用什麼來修飾呢?這種修飾有什麼意義呢?在一個ListView裡面,存在多少個VIewHolder執行個體呢?為什麼VIewHolder能夠減少findview的次數,最佳化效率呢?為了弄清楚這個問題,我做了以下測試,測試代碼很簡單,就是下面這些
public class MainActivity extends Activity {public static int itemId = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ListView listView = new ListView(this);listView.setAdapter(new MyAdapter());setContentView(listView);}private class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return 50;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.item,parent, false);viewHolder = new ViewHolder();viewHolder.tv = (TextView) convertView.findViewById(R.id.tv);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.tv.setText("item" + position);Log.d("TAG", "position=" + position + "---" + viewHolder.toString());return convertView;}}private class ViewHolder {//private static class ViewHolder {//private final class ViewHolder {//private static final class ViewHolder {private int id;public ViewHolder() {id = itemId;Log.d("TAG", "ViewHolder" + id);itemId++;}TextView tv;@Overridepublic String toString() {return "--------id=" + id;}}}
我簡單說一下代碼是什麼意思,ViewHolder有一個成員變數id,在toString()使用,用來區分不同的ViewHolder,在建構函式中,對id進行賦值,itemId是一個靜態變數,每初始化一次就+1,我們可以根據建構函式的列印次數,來計算ViewHolder的執行個體化次數,根據toString()可以來判斷到底是使用了哪一個ViewHolder。getVIew中的寫法是固定的,下面是測試結果:
private class ViewHolder修飾,介面內可見的item數量是9個,ViewHolder初始化了10次,之後開始複用ViewHolder。
private static class ViewHolder修飾,介面內可見的item數量是9個,ViewHolder初始化了10次,之後開始複用ViewHolder。
private final class ViewHolder修飾,介面內可見的item數量是9個,ViewHolder初始化了10次,之後開始複用ViewHolder。
private static final class ViewHolder修飾,完全一樣!
其實一上來我就貼一張圖就ok了,因為這幾種完全一樣,不管用什麼修飾,ViewHolder都會初始化當前介面可見item的數量+1次,和convertView的執行個體化次數是一樣的,因此,我麼不管使用什麼修飾都是沒問題的,也是沒必要的。
static修飾類,在這裡是靜態內部類,並不是說只存在一個執行個體,而是可以訪問外部類的靜態變數,final修飾類則是不讓該類繼承,我們這裡使用final毫無根據,所以,以後寫ViewHolder的時候,可以不糾結了,加什麼加啊,什麼都不用加!
【Android開發經驗】ViewHolder到底用什麼修飾?static?final?static final?