【Android開發經驗】ViewHolder到底用什么修飾?static?final?static final?
來源:程序員人生 發布時間:2015-02-09 08:34:44 閱讀次數:7342次
轉載請注明出處:http://blog.csdn.net/zhaokaiqiang1992
現在大家都知道用ViewHolder來實現listview的優化了,但是,ViewHolder到底要用甚么來修飾呢?這類修飾有甚么意義呢?在1個ListView里面,存在多少個VIewHolder實例呢?為何VIewHolder能夠減少findview的次數,優化效力呢?為了弄清楚這個問題,我做了以下測試,測試代碼很簡單,就是下面這些
public class MainActivity extends Activity {
public static int itemId = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView = new ListView(this);
listView.setAdapter(new MyAdapter());
setContentView(listView);
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return 50;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public 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;
@Override
public String toString() {
return "--------id=" + id;
}
}
}
我簡單說1下代碼是甚么意思,ViewHolder有1個成員變量id,在toString()使用,用來辨別不同的ViewHolder,在構造函數中,對id進行賦值,itemId是1個靜態變量,每初始化1次就+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修飾,完全1樣!

其實1上來我就貼1張圖就ok了,由于這幾種完全1樣,不管用甚么修飾,ViewHolder都會初始化當前界面可見item的數量+1次,和convertView的實例化次數是1樣的,因此,我么不管使用甚么修飾都是沒問題的,也是沒必要的。
static修飾類,在這里是靜態內部類,其實不是說只存在1個實例,而是可以訪問外部類的靜態變量,final修飾類則是不讓該類繼承,我們這里使用final毫無根據,所以,以后寫ViewHolder的時候,可以不糾結了,加甚么加啊,甚么都不用加!
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈