重點說演講中的第一部分——如何使用Adapter。
·
- adapter和listview以及數據源之間的關係
listview相信是大家熟知的一種視圖控件了,那麼在Adapter相信大家也是一定不會陌生。正如這位是工程師說話Adapter是listview和數據源之間的中間人。 關係如圖所示。圖片是演講時所用ppt中的圖片。
adapte listview 數據源之間的關係圖
當我們滑動listview的時候每一條數據進入可見區域的時候adapter的getView方法就會被調用,返回代表具體數據的視圖。那麼當我們的listview中有多條數 據的時候(一般都是有多條數據的),getView方法就會反覆多次的頻繁調用。這樣的listview就可以顯示很多數據,即成百上千條數據。 那麼顯而易見,由於getview方法是頻繁調用的我們應該經歷的在這個方法中儘可能少的產生對象,最大可能大的提高這個方法的工作效率。這樣我們的list的 更新速度才不至於太慢。
- 剖析listview
讓我們來虛擬一個listview 我們假設這個listview的可見區域中有7個listview,當我們用手指向上滑動一個item的時候,第一條數據就離開了可見區域。在 android系統上,爲了有效的使用java機制,設立了回收區域。那麼離開可見區域的數據就進入了會回收區域,以便於以後再次使用。adpater怎麼會對應的 標記這個離開可見區域的數據項,adapter同時會生產第八個視圖的數據並顯示在可見區域。這個就完了listview的一次更新。
- 簡單示例
我們假設需要完成的listview的每一個數據視圖如圖所示:
示例佈局 它的佈局文件如下:
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”horizontal”>
<ImageView android:id=”@+id/icon”
android:layout_width=”48dip”
android:layout_height=”48dip” />
<TextView android:id=”@+id/text”
android:layout_gravity=”center_vertical”
android:layout_width=”0dip”
android:layout_weight=”1.0″
android:layout_height=”wrap_content” />
</LinearLayout>
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”horizontal”>
<ImageView android:id=”@+id/icon”
android:layout_width=”48dip”
android:layout_height=”48dip” />
<TextView android:id=”@+id/text”
android:layout_gravity=”center_vertical”
android:layout_width=”0dip”
android:layout_weight=”1.0″
android:layout_height=”wrap_content” />
</LinearLayout>
- 最簡單的方法:
public View getView(int pos, View convertView,
ViewGroup parent){
View item = mInflater.inflate(R.layout.list_item, null);
((TextView) item.findViewById(R.id.text)).
setText(DATA[pos]);
((ImageView) item.findViewButId(R.id.icon)).
setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return item;
}
- 利用convertView回收視圖, 效率提高 200%
public View getView(int pos, View convertView,
ViewGroup parent){
if (convertView == null) {
convertView = mInflater.inflate(
R.layout.list_item, null);
}
((TextView) convertView.findViewById(R.id.text)).
setText(DATA[pos]);
((ImageView) convertView.findViewButId(R.id.icon)).
setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
- 利用ViewHolder模式,效率再次調高50%
static class ViewHolder {
TextView text;
ImageView icon;
}
public View getView(int pos, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text));
holder.icon = (ImageView) convertView.findViewButId(R.id.icon));
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[pos]);
holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text));
holder.icon = (ImageView) convertView.findViewButId(R.id.icon));
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[pos]);
holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}