視圖組件也有運行時創建和在xml定義兩種途徑,在android常用的視圖中有一個比較重要的類,AdapterView適配器視圖,適配器視圖就是用適配器(Adapter)將視圖和該視圖所依賴的數據鏈接起來。在這裏用一個繼承自BaseView的GridView來分析一下。
首先在xml文檔中定義GridView.
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="150dp"
android:numColumns="auto_fit"
android:verticalSpacing="5dp"
android:horizontalSpacing="5dp"
android:stretchMode="columnWidth"
android:gravity="center" />
Android 中app或者widget UI的定義都是有兩種方式:1.在xml中定義。 2 運行時加載也就是在代碼中定義。這裏應用xml定義。
接下來是Activity的實現。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainview);
ImageGridAdapter adapter = new ImageGridAdapter(this);
GridView mGridView = (GridView) findViewById(R.id.gridview);
mGridView.setAdapter(adapter);
mGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
}
});
}
這裏ImageGridAdapter是我們自己定義的一個Adapter,用來實現聯繫的橋樑。setOnItemClickListener()給GridView 設置一個點擊監聽器。當用戶點擊每個圖標時會做出相應的動作。這種視圖中最關鍵的就是我們自己定義的適配器。
實現ImageGridAdapter的具體如下:
public ImageGridAdapter(Context context) {
// TODO Auto-generated constructor stub
this.mContext = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return IConfig.IMGS.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ImageView iv = null;
if(convertView ==null){
iv = new ImageView(mContext);
iv.setAdjustViewBounds(true);
iv.setLayoutParams(new GridView.LayoutParams(150,150));
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
iv.setPadding(1, 100, 1, 1);
}else{
iv = (ImageView)convertView;
}
iv.setImageResource(IConfig.IMGS[position]);
return iv;
}
繼承BaseAdapter實現自己的適配器,主要要實現4個函數。
首先getCount() 表示我們將要在適配器中展示多少個數據,這個函數必須重置,如果返回0,則不會有任何數據出現。本例中IConfig是一個接口,IMGS是一個整形數組,內容是drawable下圖片的ID。因爲此例主要是展示一些圖片的GridView。
其次 getItem(int position) 返回固定位置上的對象,要明白的是你展示的是什麼數據,此函數返回的就是什麼類型。只是因爲java是單根繼承所以在此返回值是Object。如果要應用此函數必須清楚返回的類型。
再次 getItemId() 返回具體位置data的ID,沒有什麼疑問。
最重要的就是getView()這個函數設置了展示的內容的具體屬性(包括位置,大小等等),當這個函數被framework調用時,View才被傳入。首先positon表示數據的位置。convertView 要展示的對象,因爲這個對象有時侯會被回收,所以在程序中必須判斷是否爲空。如果爲空時我們就要自己定義要展示的具體內容。本例中就是對ImageView進行設置。如果不爲空則直接賦值。然後返回所要展示的對象(一個View)。
這就是通過BaseAdapter 創建自己adapter的基本方式。
因爲比較簡單,並且源碼大多已經展示,如果需要源碼可以給我留言。