當咱們繼承BaseAdapter自定義適合本身使用的Adapter時候,不可避免的要覆寫getView()方法。本身在分析藍牙4.0官方源代碼遇到這個問題,分析了幾遍,有所領悟,參考了這篇博文http://blog.csdn.net/pkxiuluo01/article/details/7380974,現結合藍牙4.0官方的這部分代碼將getView()解析一下。java
//當界面每顯示出來一個item時,就會調用該方法,getView()有三個參數,第一個參數表示該item在Adapter中的位置;第二個參數是item的View對象,是滑動list時將要顯示在界面上的item,若是有item在顯示界面消失,這時android會將消失的item返回,稱爲舊view,也就是說此時的view不爲null;第三個參數用在加載xml視圖。 public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; // General ListView optimization code. if (view == null) {//當滑動list時,若是沒有item消失,這時參數對象view是沒有任何指向的,爲null view = mInflator.inflate(R.layout.listitem_device, null);//mInflator是LayoutInflater類(佈局加載器)實例對象,該行是動態加載佈局 viewHolder = new ViewHolder();//得到實例對象 viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);//分別實例化顯示Name和Address的textView控件 viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name); view.setTag(viewHolder);//向view中添加附加數據信息,在這裏也就是兩個textView對象 } else { viewHolder = (ViewHolder) view.getTag();//若是有舊的view對象返回(該狀況是滑動list時有item消失),從該view中提取建立的兩個已經建立的textView對象,達到對象循環使用 } BluetoothDevice device = mLeDevices.get(i);//從搜索到的設備列表中獲得顯示位置設備對象。 final String deviceName = device.getName(); if (deviceName != null && deviceName.length() > 0) viewHolder.deviceName.setText(deviceName);//輸出顯示設備SSID else viewHolder.deviceName.setText(R.string.unknown_device); viewHolder.deviceAddress.setText(device.getAddress());//輸出顯示設備地址信息 return view; } ..... static class ViewHolder { //該類用來暫存textView的實例化對象,達到循環使用 TextView deviceName; TextView deviceAddress; } .....