Android——適配器Adapter類


適配器Adapter類

Adapter是連接后端數據和前端顯示的適配器接口,是數據和UI(View)之間的一個重要的紐帶。在常見的View(ListView,GirdView)等地方都需要用你到Adapter。

類結構圖如下:

這里寫圖片描述
圖中可以看到在Android中與Adapter有關的所有接口、類的完整層級圖。在我們使用過程中可以根據自己的需求實現接口或者繼承類進行一定的擴展。比較常用的是ArrayAdapter、BaseAdapater、SimpleAdapter、SimpleCursorAdapter等。

  • ArrayAdapter支持泛型操作,最為簡單,只能展示一行字。
  • BaseAdapter是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性。
  • SimpleAdapter有最好的擴充性,可以自定義出各種效果。可以認為SimpleAdapter對數據庫的簡單結合,可以方便地把數據庫的內容以列表的形式展示出來。
  • SimpleCursorAdapter可以適用於簡單的純文字ListView,它需要Cursor的字段和UI的id對應起來。如果需要實現更為復雜的UI也可以重寫其他方法。

ArrayAdapter類

ArrayAdapter通常用於將數組或者List集合的多個值包裝成多個列表項。
ArrayAdapter有六種構造方法,如果只是搭配簡單的視圖,一般使用下面這種構造方法。

常用的構造方法

    public ArrayAdapter(Context context,int resource,int textViewResourId,T[] object);
public ArrayAdapter(Context context,int resource,int textViewResourId,List<T> object);
//context代表上下文,一般傳入當前Activity
//resource代表布局資源,傳入你需要的文件,一般直接使用android.R.layout.simple_list_item_1,這個布局包含一個TextView
//textViewResourId代表的是resource布局中的TextView的Id號,使用系統布局時傳入android.R.id.text1
//其中T代表泛型,數組和集合中就是我們的數據

使用ArrayAdapter可以完成AutoCompleteTextView視圖

BaseAdapter類

BaseAdapter是Adapter中最重要的一個類,一般我們都習慣使用BaseAdapter來定義的適配器,雖然他需要重寫里面的很多方法。

BaseAdapter中的抽象方法

public abstract int getCount() //條目數量
public abstract Object getItem(int position) //獲取position對應item數據
public abstract long getItemId (int position) //獲取position的Id
public abstract View getView(int position,View convertView,ViewGroup parent)//獲取position視圖

我們需要是實現這4個抽象方法,其中最重要的就是getView方法

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView)findViewById(R.id.listview);
//為listview設置適配器
MyBaseAdapter adapter = new MyBaseAdapter();
listview.setAdapter(adapter);
}
List<String>mList;//數據存放
//初始化數據
public void initDate(){
mList = new ArrayList<String>();
//增加10條數據
for(int i =0;i < 10;i++){
mList.add("第"+i+"條");
}
}
public class MyBaseAdapter extends BaseAdapter{
@Override
public int getCount(){
return mList.size();
}
@Override
public Object getItem(int position){
return mList.get(position);
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position,View converView,ViewGroup parent){
TextView textView = new TextView(MainActivity.this);//如果是外部類,需要構造方法傳入上下文
textView.setText(mList.get(position));//獲取調用getItem
return textView;
}
}

在getView中,如果設置復雜的View,並且數量超過一個屏幕,那么每次用戶上滑和下滑,都會調用getView方法 ,那么當滑動次數多次后,會創建非常多的視圖並沒有被釋放,這是會非常卡頓的,為了解決這個問題,我們需要ListView視圖重用技術,在getView中,傳入的converView就是上次離開屏幕的視圖,我們需要重用它。

原理如下圖所示

這里寫圖片描述

代碼實現

@Override
public View getView(int position,View converView,ViewGroup parent){
ViewHolder holeder;//聲明重用布局類
if(converView == null){
//初次加載屏幕上的條目時,convertView是空的,我們需要去加載布局並且初始化ViewHolder
convertView = View.inflate(MainActivity.this,R.layout.user.info,null);//將布局實例化成對象
holder = new ViewHolder(converView);//初始化ViewHolder
convertView.setTag(holder);
}else{
//否則,將ViewHolder拿出來
holder = (ViewHolder)convertView.getTag();
}
//現在我們的ViewHolder已經初始化完畢了,不管那一次進來,還是滑動后的視圖
//我們需要給視圖設置值
Info info = mList.get(position);
holder.title.setText(info.getTitle());
holder.headpic.setImageResource(info.getHeadPic());
holder.info.setText(info.getInfo());
return convertView;
}
class ViewHolder{
TextView title;
ImageView headpic;
TextView info;
void ViewHolder(View convertView){
title = (TextView)convertView.findViewById(R.id.title);
headpic = (ImageView)convertView.findViewById(R.id.headpic);
info = (TextView)convertView.findViewById(R.id.info);
}
}

SimpleAdapter類

SimpleAdapter是擴展性最好的適配器,可以定義各種你想要的布局。

構造方法

SimpleAdapter(Context context,List<?extends Map<String,?>>data,int resource,String[]from,int[]to)
參數context:上下文,比如this。關聯SimpleAdapter運行的視圖上下文
參數data:Map列表,列表要顯示的數據,這部分需要自己實現,類型要與上面的一致,每條項目與from中的指定條目一致
參數resource:ListView單項布局控件的Id,這個布局就是自定義的布局,你想顯示什么樣子的布局都在這個布局中。這個布局中必須包括了to中定義的控件id
參數from:一個被添加到Map上關聯每一個項目列名的列表,數組里面是列名稱
參數to:是一個int數組,數組里面的id是定義布局中的各種控件的id,需要與上面的from對應

代碼示例

SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,getData(),R.layout.main, new String[] { "img", "title", "info" },new int[] { R.id.img, R.id.title, R.id.info });
private List<Map<String,Object>> getData(){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map = new HashMap<String,Object>();
//Map中的key必須與適配器中from數組中相同
//而to中必須和from一一對應
map.put("img",R.drawable.img1);
map.put("title","first");
map.put("info","第一個");
list.app(map);

map = new HashMap<String,Object>();
map.put("img",R.drawable.img2);
map.put("title","second");
map.put("info","第二個");
list.app(map);

map = new HashMap<String,Object>();
map.put("img",R.drawable.img3);
map.put("title","third");
map.put("info","第三個");
list.app(map);
return list;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com