首页

SimpleAdapter类

搜索

概述

SimpleAdapter是BaseAdapter的子类。是比ArrayAdapter类更加强大的适配器,用该适配器可定义表现更丰富的信息,例如在ListView列表项中显示带文字和图片的信息。

构造方法

 

 

图-6

说明:

1、参数-context:上下文参数,该参数与ArrayAdapter类的构造方法中的第一个参数相同。

2、参数-data:一个List类型的集合,该集合的元素是Map集合,该Map集合的键是String类型,值是任意类型。每个Map对象中都存放着列表项的信息。

例如,图-7是用ListView显示的图文并茂的列表。

其中,每个列表项的布局都是左图右字,即:左边是一个ImageView控件,右边是一个TextView控件。这种列表项需要用SimpleAdapter适配器来实现。

SimpleAdpater适配器用Map对象存储列表项的数据信息。例如,图-7的显示北京市的列表项用以下代码将图片和文字的信息存放在Map对象中:

//创建Map对象item,以键/值对的形式存放图片的资源索引值和标签的标题。

Map<String,Object> item=new HashMap<String, Object>();

//以键名photoId,值R.drawable.beijing存放图片数据

item.put("photoId", R.drawable.beijing);

item.put("name", “北京”);//以name/北京的键/值对存放标签的标题

data.add(item);//将item添加至集合data中

说明:

资源索引值R.drawable.beijing是int类型,表示存放在res/drawable-mdpi/ beijing.png,该图片就是图-7中的北京市列表项中的图片。

第3行代码将item对象添加至data集合中。那么图-7有三个列表项,则以上三行代码要重复三次,将每个城市的信息先存放在Map对象中,再存放至List集合中。

图-7

3、参数-resource:是布局文件的资源索引值,该布局控制列表项的显示样式,例如图-7的每个列表项的布局文件代码如下(该布局文件名:listview_item.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">

<!-- 城市图片 -->

<ImageView 

android:id="@+id/ivCity"

android:layout_width="85dp"

android:layout_height="62dp"

android:src="@drawable/beijing"/>

<!-- 城市名称 -->

<TextView 

android:id="@+id/tvCity"

android:layout_width="85dp"

android:layout_height="62dp"

android:textSize="20sp"

android:gravity="center_vertical"

android:text="北京"/>

</LinearLayout>

对以上布局文件,在图-6的构造方法中,第三个参数值是:R.layout.listview_item。

4、参数-from:一个字符串类型的数组,该数组中存放着所有键名,这些键名就是存放列表项的Map对象中出现的键。例如,上述代码中的”photoId”和”name”,这时候第四个参数表示为:

new String[]{“photoId”,”name”};

5、参数-to:存放列表项的布局文件中出现的所有控件的资源索引值,如listview_item.xml文件中出现的ImageView和TextView控件,它们的索引值被分别定义为”@+id/ivCity”和”lvCity”,这时候第五个参数值是new int[]{R.id.ivCity,R.id,tvcity}。

控制图-7的适配器对象的完整的构造方法如下代码所示:

SimpleAdapter adapter=new SimpleAdapter(

         this, data, R.layout.listview_item, 

         new String[]{"photoId","name"},

         new int[]{R.id.ivCity,R.id.tvCity});

图-8是ListView和SimpleAdapter之间的关系的示意图:

这里ListView负责显示信息,而显示的样式和数据由SimpleAdapter设置,

示例

以下是显示图-7的效果的Java代码(相关图片和布局文件的定义省略):

public class MainAct extends Activity {

String[] mCityNames;//存放城市名称

//mList集合:存放所有城市的图片和名称

List<Map<String, Object>> mList=new ArrayList<Map<String,Object>>();

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        initData();//初始化集合

        //创建列表对象

        ListView lvCity=(ListView)findViewById(R.id.lvCity);

        /*创建SimpleAdapter对象

         * 第一个参数-this:上下文对象

         * 第二个参数-mList:列表的数据(存放所有城市的集合)

         * 第三个参数-R.layout.listview_item:列表项的布局资源索引值

         * 第四个参数:键名数组

         * 第五个参数:列表项布局中所有控件的资源索引值

         */

        SimpleAdapter adapter=new SimpleAdapter(

         this, mList, R.layout.listview_item, 

         new String[]{"photoId","name"},

         new int[]{R.id.ivCity,R.id.tvCity});

        lvCity.setAdapter(adapter);

    }

    //初始化集合数据

private void initData() {

//从资源中获得城市名称的数组

mCityNames=getResources().getStringArray(R.array.citys);

//photoId:城市图片的资源索引值数组

        int[] photoId={

           R.drawable.beijing,R.drawable.tianjing,

           R.drawable.shanghai, R.drawable.chongqing

        };

        Map<String,Object> item;//存放一个城市的图片、名称的数据

         //将北京市的图片和名称添加至mList集合中

         item=new HashMap<String, Object>();

    item.put("photoId", photoId[0]);

    item.put("name", mCityNames[0]);

    mList.add(item);

//将天津市的图片和名称添加至mList集合中

item=new HashMap<String, Object>();

item.put("photoId", photoId[1]);

item.put("name", mCityNames[1]);

mList.add(item);

//将上海市的图片和名称添加至mList集合中

item=new HashMap<String, Object>();

item.put("photoId", photoId[2]);

item.put("name", mCityNames[2]);

mList.add(item);

}

自定义SimpleAdapter

概述

为更好的理解SimpleAdapter类的运行机制,以下创建一个继承自BaseAdapter类的MySimpleAdapter类,该类模仿SimpleAdapter类,实现类似于SimpleAdaptrer的功能。

定义MySimpleAdapter类

public class MySimpleAdapter extends BaseAdapter {

Context mContext;//上下文

//存放数据的集合

List<Map<String,Object>> mList;

int mResId;//布局View的资源索引值

String[] mKey;//键名数组

int[] mResItemIds;//控件的资源索引值数组

//构造方法

public MySimpleAdapter(Context mContext, List<Map<String, Object>> mList,

int mResId, String[] mKey, int[] mResItemIds) {

super();

this.mContext = mContext;

this.mList = mList;

this.mResId = mResId;

this.mKey = mKey;

this.mResItemIds = mResItemIds;

}

//返回集合元素总数

@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;

}

//重写getView方法,每次创建一个列表项

@Override

public View getView(int position, View convertView, ViewGroup parent) {

//从集合中取出当前(索引值为position)Map对象->item

Map<String,Object> item=mList.get(position);

//获得布局布局对象

LinearLayout ll=(LinearLayout)LayoutInflater.from(

mContext).inflate(mResId, null);

//创建图像对象

ImageView ivCity=(ImageView)ll.findViewById(mResItemIds[0]);

//设置图片

ivCity.setImageResource((Integer)item.get(mKey[0]));

//创建标签对象

TextView tvCity=(TextView)ll.findViewById(mResItemIds[1]);

//设置标签的标题

tvCity.setText(item.get(mKey[1]).toString());

//返回布局对象

return ll;

}

}

说明:

以上代码中有四块比较重要,

1、标注(1)处定义了五个成员变量,这五个成员变量分别表示上下文对象、存放列表数据的集合对象、存放布局文件的资源索引值变量,存放键名的数组和存放布局中出现的所有控件的资源索引值数组。

2、标注(2)是类的构造方法,该方法带五个参数,这五个形参接收从外部传递过来的实参,并将这些数据赋值给标注(1)中定义的那五个成员变量。

注意:标注(2)中定义的五个参数以及这些参数的排列顺序与SimpleAdapter的构造方法中的参数完全一样。

3、标注(3)所指的getCount方法,该方法返回集合元素的总数,该方法在构造方法执行之后执行,确保列表能按照集合元素的个数创建相应数量的列表项。

4、标注(4)所指的getView()方法,该方法负责创建一个列表项,并将list集合中索引值为position的Map对象取出并将图片和文字的信息存放在ImageView和TextView对象的相应属性中。

注意:该方法返回一个LinearLayout类型的对象。

在标注(4)中首先通过解析器将listView_item.xml文件解析为一个LinearLayout对象,对象名为ll,并通过ll.findViewById创建ImageView和TextView对象。注意:只有在findViewById方法前面指明ll,才能在该布局中查找到相应的控件。

在标注(4)所指的代码中,

●mResId就是listview_item.xml的资源索引值。

●mResItemIds[0]是R.id.ivCity。

●mResItemIds[1]是R.id.lvCity。

●mKey[0]是键名photoId。

●mKey[1]是键名name。

调用MySimpleAdapter类

以下是在MainAct类中调用自定义的MySimpleAdapter类的关键代码,实现图-7的效果。

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        initData();//初始化集合对象mList

        //实例化列表对象

        ListView lvCity=(ListView)findViewById(R.id.lvCity);

        /*创建自定义的MySimpleAdapter对象

         * 第一个参数-this:上下文对象

         * 第二个参数-mList:列表的数据(存放索引城市的集合)

         * 第三个参数-R.layout.listview_item:列表项的布局资源索引值

         * 第四个参数:键名数组

         * 第五个参数:每个列表项用到的控件的资源索引值

         */

        MySimpleAdapter adapter=new MySimpleAdapter(

           this, mList, R.layout.listview_item, 

           new String[]{“photoId”,”name”}, 

new int[R.id.ivCity,R.id.lvCity);

        lvCity.setAdapter(adapter);//设置列表与适配器相关联

    }

上一页 下一页