在ListView,GridView。。。。中經常用到適配器Adapter,但是anroid 提供的Adapter只是幾種框架,如果我們有需求,還是要自己根據需求而自定義Adapter的
android提供的三種Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是簡單的字符串適配器(很醜,因爲沒辦法帥。。。),SimpleAdapter是可以自定義子View佈局的,可以有圖片(只限於本地圖片,如果要用網絡加載圖片,請參考我之前的一篇Blog),SimpleCursorAdapter主要用於數據庫,前兩個的數據來源一般都是String[]或者List,後一個的數據來源一般是數據庫查詢得到的Cursor
而我們自定義用的最多的還是繼承自SimpleAdapter,下面說一下具體用法
我還是連着上一篇Blog,想做一個顯示帶下載進度條的子View顯示於ListView中,SimpleAdapter可以顯示一般的圖片,但是無法顯示進度條(因爲不只是要顯示,還要有實時更新),所以我們的做法是繼承SimpleAdapter,具體要複寫的方法有4個:
public int getCount()
public Object getItem(int position)
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent)
還有一個更重要的是其構造方法MyAdapter(Context context, List<Map<String, Object>> list),參數不是固定的,可以根據要用到的數據自己定義,第一個參數是要顯示的上下文環境,第二個參數是用來記錄各個條目的信息
第一個方法主要是返回ListView中要顯示的子View數量,也就是下載任務數,只要返回構造方法中的list的條目就可以了
第二個方法是要返回一個子View,即ListView中的一個子條目,當然你也可以自定義返回你想要的信息
第三個方法是根據ListView中的位置返回id、
最重要最難理解的也就是第四個方法了,第四個方法主要是返回這個條目的整個信息,它是一個單獨的佈局文件,當然根據android結構也是一個View類的繼承類了,這裏還有一個知識點是LayoutInflater類,它的inflate()方法可以根據佈局文件獲得其View返回值,而最重要的思想是你要從這些條目中獲得其子View(關係爲ListView中有很多條目,每個條目中又有很多組件,我這裏是ListView中多個下載任務是不同的條目,每個下載任務中的名字,進度又是其子View的組件),再得到其子組件之後,就可以根據構造方法中List<Map<String,
Object>> list參數傳遞的值進行對應的賦值或者設置資源了,具體代碼如下:
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter
{
private Context context;
private LayoutInflater layoutInflater;
private List<Map<String, Object>> list;
//構造方法,參數list傳遞的就是這一組數據的信息
public MyAdapter(Context context, List<Map<String, Object>> list)
{
this.context = context;
layoutInflater = LayoutInflater.from(context);
this.list = list;
}
//得到總的數量
public int getCount()
{
// TODO Auto-generated method stub
return this.list!=null? this.list.size(): 0 ;
}
//根據ListView位置返回View
public Object getItem(int position)
{
// TODO Auto-generated method stub
return this.list.get(position);
}
//根據ListView位置得到List中的ID
public long getItemId(int position)
{
// TODO Auto-generated method stub
return position;
}
//根據位置得到View對象
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView == null)
{
convertView = layoutInflater.inflate(R.layout.item, null);
}
//得到條目中的子組件
TextView tv1 = (TextView)convertView.findViewById(R.id.nameTextView);
ProgressBar pb = (ProgressBar)convertView.findViewById(R.id.sizeProgressBar);
TextView tv2 = (TextView)convertView.findViewById(R.id.sizeTextView);
//從list對象中爲子組件賦值
tv1.setText(list.get(position).get("name").toString());
pb.setProgress(Integer.parseInt(list.get(position).get("size").toString()));
tv2.setText(list.get(position).get("size").toString());
return convertView;
}
}