Android中常用的Adapter的種類和用法


一、常用的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; } }

  至此大數據的優化完成,系統效率提高不少

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM