您好,登錄后才能下訂單哦!
ListView在安卓開發中,是經常需用使用的控件,而用這個控件,就離不開它的數據綁定,這時候Adapter(數據適配器)就起了很大作用
在學習了多種Adapter(適配器之后),感覺比較常用的三種就是ArrayAdapter和SimpleAdapter以及BaseAdapter.
ArrayAdapter用法最為簡單,但功能較為單一,一般只能顯示簡單的文本信息。
SimpleAdapter有所提升,能通過自己編寫一個布局來顯示圖像和文本,但缺點在于模板單一,只能使用固定的1個模板
而BaseAdapter(基礎適配器)則最為自由,可以通過重寫方法來實現自己想要的各種的布局,但是難度較大,接下來將淺談一下自己對BaseAdapter的使用及優化方法。
要使用BaseAdapter,先寫一個class類繼承BaseAdapter,并實現其方法,方法如下
getCount()為獲取數據條目的數量,返回值也就是數據條目的數量(這個返回值數據條目的數量一定要寫)、getItem()為獲取對應ID項對應的Item(可以不用管)、getItemId()為獲取對應項ID(也可以不用管),最后一個方法最為重要也就是getView(int position,View covertView,ViewGroup arg2),重寫的主要是這個方法
事先準備如下其中context為上下文,List<...>集合可以根據自己需要用泛型來規定自己的數據,這里只是簡單例子
接下來就開始重寫getView(...)方法,步驟主要分為:
第一種寫法:
// 獲取納秒時間 更加精確
long start = System.nanoTime();
// 由于我們只需要將XML轉化為View,并不涉及到具體的布局,所以第二個參數通常設置為null
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item, null);
// 實例化控件(這些控件為自己在根據需要在布局中加的控件)
ImageView itemImage = (ImageView) view.findViewById(R.id.iv_p_w_picpath);
TextView itemTitle = (TextView) view.findViewById(R.id.tv_title);
TextView itemContent = (TextView) view.findViewById(R.id.tv_content);
// 取出contact對象
Contact contact = contacts.get(position);
// 設置控件的數據
itemImage.setImageResource(contact.itemImageResid);
itemTitle.setText(contact.itemTitle);
itemContent.setText(contact.itemContent);
//記錄時間
long end = System.nanoTime();
long dValue = end - start;
mSumTime += dValue;
// 輸出每次getView消耗的時間和
Log.d("ATG", String.valueOf(mSumTime));
return view;
這種方法最基礎,也最耗時,原因是函數沒被調用一次,所有步驟都要執行一次,實際上有些步驟或控件是可以重用的。
第二種改良方法:
// 獲取納秒時間 更加精確
// long start = System.nanoTime();
// 當第一次調用該方法是,才需要將布局模塊轉為View對象,其它時候不需要了
// if (convertView == null) {
// LayoutInflater inflater = LayoutInflater.from(context);
// convertView = inflater.inflate(R.layout.item, null);
// }
// ImageView itemImage = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);
// TextView itemTitle = (TextView) convertView.findViewById(R.id.tv_title);
// TextView itemContent = (TextView) convertView.findViewById(R.id.tv_content);
// // 取出contact對象
// Contact contact = contacts.get(position);
// 設置控件的數據
// itemImage.setImageResource(contact.itemImageResid);
// itemTitle.setText(contact.itemTitle);
// itemContent.setText(contact.itemContent);
// long end = System.nanoTime();
// long dValue = end - start;
// mSumTime += dValue;
// 輸出每次getView消耗的時間和
// Log.d("ATG", String.valueOf(mSumTime));
// return convertView;
這種方法將無謂的重復的吧布局模塊轉為View對象的步驟簡化
第三種方法:
// 獲取納秒時間 更加精確
// long start = System.nanoTime();
// ViewHolder holder = null;
// if (convertView == null) {
// holder = new ViewHolder();
// LayoutInflater inflater = LayoutInflater.from(context);
// convertView = inflater.inflate(R.layout.item, null);
// holder.img = (ImageView) convertView.findViewById(R.id.iv_p_w_picpath);
// holder.title = (TextView) convertView.findViewById(R.id.tv_title);
// holder.content = (TextView) convertView.findViewById(R.id.tv_content);
// convertView.setTag(holder);
// } else {
// holder = (ViewHolder) convertView.getTag();
// }
// 取出contact對象
// Contact contact = contacts.get(position);
// 設置控件的數據
// holder.img.setImageResource(contact.itemImageResid);
// holder.title.setText(contact.itemTitle);
// holder.content.setText(contact.itemContent);
// long end = System.nanoTime();
// long dValue = end - start;
// mSumTime += dValue;
// 輸出每次getView消耗的時間和
// Log.d("ATG", String.valueOf(mSumTime));
// return convertView;
}
// ViewHolder用于緩存控件
class ViewHolder{
public ImageView img;
public TextView title;
public TextView content;
}
這種方法將初始化控件也設置在了只在第一次調用時使用,這用就避免了多次尋找控件初始化的操作,這種方法是這三種方法中優化效果最好,也最推薦使用,因為當運行程序較大時,每一步的優化都尤為關鍵。
然后就是創建適配器ContactAdapter contactadapter = new ContactAdapter(this, contacts);
最后就是將ListView控件加載到適配器中listView.setAdapter(contactadapter);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。