AdapterTestActivity.java
package hyz.com.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
public class AdapterTestActivity extends Activity implements OnItemClickListener,OnItemSelectedListener
{
private static final Integer[] strs = {R.string.str1,R.string.str2,R.string.str3};
private static final Integer[] imgs = {R.drawable.img1,R.drawable.img2,R.drawable.img3};
private ListView listView;
private Spinner spinner;
private Gallery gallery;
private GridView gridView;
/*
* ArrayAdapter數組適配器,它的作用就是一個數組和listview之間的橋樑,
* 它可以將數組裏邊定義的數據一一對應的顯示在Listview裏邊。
* ListView的每個TextView裏邊顯示的內容就是數組裏邊的對象調用toString()方法後生成的字符串。
*/
private ArrayAdapter<String> arrayAdapter;
private List<Map<String,Object>> arrayList;
private SimpleAdapter simpleAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.myListView);
spinner = (Spinner)findViewById(R.id.mySpinner);
gridView = (GridView)findViewById(R.id.myGridView);
gallery = (Gallery)findViewById(R.id.myGallery);
arrayList = new ArrayList<Map<String, Object>>();
for (int i = 0; i < strs.length; i++)
{
Map<String, Object> map = new HashMap<String, Object>();
/*
* 探索了半天,通過id來映射資源貌似只能用下面的方法
* 如裏不用id,可以這樣寫:
* map.put("str","字符串");
* map.put("img",R.drawable.img1);
* 不過這樣寫就不能用for循環了
*/
map.put("str",getResources().getString(strs[i]));
map.put("img",imgs[i]);
arrayList.add(map);
}
//下面的適配器可以互相使用來顯示效果
spinner.setAdapter(getSimpleAdapter(this));
spinner.setOnItemSelectedListener(this);
gridView.setAdapter(new GridAdapter(this));
gridView.setOnItemClickListener(this);
listView.setAdapter(new MyListAdapter(this));
listView.setOnItemClickListener(this);
gallery.setAdapter(new GalleryAdapter(this));
}
//這是一個SimpleAdapter,適配了圖片和字符串
public SimpleAdapter getSimpleAdapter(Context context)
{
simpleAdapter = new SimpleAdapter(getApplicationContext(), arrayList, R.layout.list_main,
new String[]{"str","img"}, new int[]{R.id.tv,R.id.iv});
return simpleAdapter;
}
public ArrayAdapter<String> getArrayAdapter(Context context)
{
/*
* android系統默認提供了很多默認的佈局方式,也可以自定義。
* android.R.layout.simple_list_item_1:每一項只有一個TextView
* android.R.layout.simple_list_item_2:每一項有兩個TextView
* android.R.layout.simpte.list_item_single_choice,每一項有一個TextView,但是這一項可以被選中。
* android.R.layout.simple_expandable_list_item_1:每一項只有一個TextView
*/
// 第一種ArrayAdapter,除了上面系統自帶的佈局,還可以使用自定義xml,
// 但這xml只能有一個textView,連開頭的LinearLayout都不能有.
// 每一個add(),相當給ListView增加一個列表項,系統都會把add裏的值放在typedef.xml裏的TextView
/*
*arrayAdapter = new ArrayAdapter(this, R.layout.typedef);
*arrayAdapter.add("1");
*arrayAdapter.add("2");
*arrayAdapter.add("3");
*/
// 第二種ArrayAdapter ,如果上面的自定義佈局還需要顯示其它組件,可用下面的形式。
//每一個add,系統會把值放在typedef1裏的id爲textview的TextView
arrayAdapter = new ArrayAdapter<String>(this, R.layout.list_main, R.id.tv);
arrayAdapter.add("arrayAdapter1");
arrayAdapter.add("arrayAdapter2");
arrayAdapter.add("arrayAdapter3");
//第三種,就是自定義類繼承BaseAdapter,相當於下面的MyListAdapter
return arrayAdapter;
}
class ViewHolder
{
ImageView imageView;
TextView textView;
}
//BaseAdapter主要用途是將一組數據傳到像ListView、Spinner、Gallery及GridView等UI顯示組件
class MyListAdapter extends BaseAdapter
{
private LayoutInflater inflater;
private ViewHolder holder;
public MyListAdapter(Context context)
{
inflater = LayoutInflater.from(context);
}
@Override
public int getCount()
{
return strs.length;
}
@Override
public Object getItem(int position)
{
return position;
}
@Override
public long getItemId(int position)
{
return position;
}
/*
* listView在開始繪製的時候,系統首先調用getCount()函數,根據他的返回值得到 listView的長度,
* 然後根據這個長度,調用getView()逐一繪製每一行。系統顯示列表時,首先實例化一個適配器(這裏將實例化自定義的適配器)。
* 當手動完成適配時,必須手動映射數據,這需要重寫getView()方 法。系統在繪製列表的每一行的時候將調用此方法。
* getView()有三個參數,position表示將顯示的是第幾行,位置從0開始;covertView是從佈局文 件中inflate來的佈局,
* 是Spinner,ListView中每一項要顯示的view,通常return 的view也就是convertView;
* parent就是父窗體了,也就是Spinner,ListView,GridView.
* 我們用LayoutInflater的方法將定義好的item.xml文件提取成View實例用來顯示。
* 然後將xml文件中 的各個組件實例化(簡單的findViewById()方法)。這樣便可以將數據對應到各個組件上了。
*/
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
/*
* LayoutInflater是用來找layout下xml佈局文件,並且實例化!
* 而findViewById()是找具體xml下的具體 widget控件(如:Button,TextView等)。
* 下面倆種方法都可以
* 1、LayoutInflater inflater = getLayoutInflater();
* 2、 LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
*/
if (convertView == null)
{
convertView = inflater.inflate(R.layout.list_main, null);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.iv);
holder.textView = (TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(strs[position]); // 設置字符串
holder.imageView.setBackgroundResource(imgs[position]); // 設置圖標
return convertView;
}
}
class GridAdapter extends BaseAdapter
{
private Context mContext;
public GridAdapter(Context mContext)
{
this.mContext = mContext;
}
public int getCount()
{
return strs.length;
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
TextView textView = new TextView(mContext);
Drawable ico = getResources().getDrawable(imgs[position]);
//圖片在這個textView出現的上、下、左、右位置
textView.setCompoundDrawablesWithIntrinsicBounds(null, ico, null, null);
textView.setText(strs[position]);
//文字的位置
textView.setGravity(Gravity.CENTER);
//textView.setHeight(100);
return textView;
}
}
class GalleryAdapter extends BaseAdapter
{
private Context mContext;
public GalleryAdapter(Context mContext)
{
this.mContext = mContext;
}
public int getCount()
{
return strs.length;
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView view = new ImageView(mContext);
view.setImageResource(imgs[position]);
view.setLayoutParams(new Gallery.LayoutParams(80,80));
//設置ImageView的拉昇類型,這裏採用居中,您可以嘗試不同的類型
view.setScaleType(ImageView.ScaleType.FIT_CENTER);
return view;
}
}
//網格佈局或ListView每一格或每一列的監聽事件(從左到右或從上到下position=0,1,2)
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
{
switch(position)
{
case 0: Toast.makeText(this, "第一個位置", Toast.LENGTH_SHORT).show();break;
case 1: Toast.makeText(this, "第二個位置", Toast.LENGTH_SHORT).show();break;
case 2: Toast.makeText(this, "第三個位置", Toast.LENGTH_SHORT).show();break;
default: Toast.makeText(this, "其它位置", Toast.LENGTH_SHORT).show();break;
}
}
//下面兩個函數是Spinner下拉列表的監聽事件
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
switch(arg2)
{
case 0: Toast.makeText(this, "第一個位置", Toast.LENGTH_SHORT).show();break;
case 1: Toast.makeText(this, "第二個位置", Toast.LENGTH_SHORT).show();break;
case 2: Toast.makeText(this, "第三個位置", Toast.LENGTH_SHORT).show();break;
default: Toast.makeText(this, "其它位置", Toast.LENGTH_SHORT).show();break;
}
}
public void onNothingSelected(AdapterView<?> arg0)
{
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Spinner
android:id="@+id/mySpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ListView
android:id="@+id/myListView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<Gallery
android:id="@+id/myGallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<GridView
android:id="@+id/myGridView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:numColumns="3"/>
</LinearLayout>
list_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#aa0000">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#0000aa"/>
<ImageView
android:id="@+id/iv"
android:layout_width="40dip"
android:layout_height="40dip"/>
</LinearLayout>
typedef.xml
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#0000FF"
>
</TextView>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TypedefSpinnerTest</string>
<string name="str1">選項1</string>
<string name="str2">選項2</string>
<string name="str3">選項3</string>
</resources>