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>