一、常用的adapter:
1、BaseAdapter:基礎數據適配器,它的主要用途是將一組數據傳到例如ListView等UI顯示組件,繼承自接口類Adapter,由於是基礎類型,所以自由度高, 可以修改的地方多
2、SimpleAdapter:簡單適配器,系統自定義了一些方法,可以重寫這些方法
3、ArrayAdapter:數據和UI一對一,傳入數據源和布局文件,完成顯示
4、SimpleCursorAdapter:指向性適配器,指向數據庫,可以方便地把數據庫的內容以列表的形式展示出來
二、用法:
1、BaseAdapter:自己寫構造體和方法,然后在getview中返回view到列表項綁定
2、SimpleAdapter:
格式:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
其中:context是上下文,data指map對象數組,resource指布局文件,from指data中map對象所對應的鍵名,to指resource中控件id
3、ArrayAdapter:
格式:ArrayAdapter<String>(Context context, int resource, int textViewResourceId, String[] objects)
其中:context是上下文,resource指布局文件,textViewResourceId布局文件中綁定數據的控件id,objects數據數組
4、SimpleCursorAdapter :
格式:SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)
其中:context是上下文,layout指布局文件,c指數據cusor,from指數據庫列名,to值綁定的控件id,flags標識當數據改變調用onContentChanged()的時候,是否通知ContentProvider數據進行了改變
三、優化
每種adapter都有getview方法返回對應的view到控件,如果復寫該方法就能返回自定義view到控件上顯示,例如這樣:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{ View item = mInflater.inflate(R.layout.list_item_layout, null); ((TextView) item.findViewById(R.id.showtext)).setText(data[position]); return item; }
問題:上面的方法在少量的數據時不會有問題,但是大量的數據時,例如上百條,那消耗的系統資源就很大
解決方法:減少view創建次數
1、判斷convertView是否已經創建,如果創建了就直接使用在進行數據綁定
@override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_layout, null); } ((TextView) item.findViewById(R.id.showtext)).setText(data[position]); return convertView;
}
這樣寫就減少了view的創建次數,提高了效率,但是數據的綁定還是每次都重新綁定,效率還是不高,所以為了更一步提高效率,就使用下邊的方法
2、ViewHolder的使用
原理:在ViewHolder中提前定義好綁定的對象,這樣一次綁定就能一直使用,不用重新創建和綁定,相比上面提高了效率
class ChatListAdapter extends BaseAdapter {
private class ViewHolder { TextView showtext; }
//各種省略
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.list_item_layout, null); holder = new ViewHolder(); holder.showtext= (TextView) convertView.findViewById(R.id.showtext);
//將holder放入view的tag中,方便下次直接讀取,類似於緩存的概念 convertView.setTag(holder); } else {
//從tag中讀出holder來 holder = (ViewHolder) convertView.getTag(); } holder.showtext.setText(...); return convertView; } }
至此大數據的優化完成,系統效率提高不少