8.1.从资源中获取数组

8.1.1.概述

除了在Java代码中定义数组,Android还提供了在资源中定义数组,然后在Java代码中解析资源,从而获取数组的方法。

实际开发中,推荐将数据存放在资源文件中,以实现程序的逻辑代码与数据分离,便于项目的管理,尽量减少对Java代码的修改。

8.1.2.在资源中定义数组

步骤1、在res/values文件夹下创建arrays.xml文件;

步骤2、在arrays.xml文件中创建一个数组,如下代码所示:

<?xmlversion="1.0"encoding="UTF-8"?>

<resources>

<string-arrayname="citys">

<item>北京</item>

<item>天津</item>

<item>上海</item>

<item>重庆</item>

</string-array>

</resources>

说明:

Android规定存放数组的文件必须在res/values文件夹下创建,推荐存放资源数组的文件名为arrays.xml。

以上定义了一个含有四个直辖市名称的字符串数组,数组名是citys,数组元素在<item>标签中存放。

8.1.3.Resource类

8.1.3.1.概述

Android提供了Resource类,通过该类提供的方法可以很方便地获取资源中的数据,如资源中定义的数组。

8.1.3.2.创建Resources对象

getResource();

作用:该方法是ContextWrapper类的静态方法,用于创建Resources对象。

示例:以下代码创建一个Resources对象:

Resourcesres=Resources.getResource();

说明:该方法必须在Context类及其子类中才能使用。

8.1.3.4.常用方法

getStringArray(intresId);

作用:获取资源索引值为resId的字符串类型的数组。

示例:以下代码将8.1.2.中创建的citys数组获取并存放在数组citys中:

Resourcesres=getResources();

String[]citys=res.getStringArray(R.array.citys);

提示:Resources还提供了获取int、boolean等类型的数组的方法,本章仅介绍本章代码中用到的获取字符串数组的方法。

8.2.ListView控件

8.2.1.概述

ListView是android应用程序中使用频率最高的控件。该控件使用垂直列表的方式显示多个选项,特别适合于手机这种屏幕相对较小的设备。

ListView控件的特点:每个列表项独占一行,每行的布局都相同,数据和布局分离,

数据来自适配器,ListView只负责显示,图-1是ListView的一个应用:

图-1

8.2.2.常用属性

XML属性

说明

choiceMode

设置ListView的选择方式,有三个值:

(1)none:默认方式

(1)SingleChoice:单选

(2)multipleChoice:复选

divider

设置列表项的分隔条,分隔条可以是颜色值也可以是图片

entries

指定一个字符串数组资源,用于显示在ListView中

8.2.3.常用方法

1、ObjectgetItemAtPosition(intposition)

作用:获得当前列表项

参数-position:当前列表项的索引值。

示例:

//获取索引值是position的列表项,转换为字符串

Stringtext=(String)listView.getItemAtPosition(position);

2、voidsetChoiceMode(intchoiceMode)

作用:设置列表的选择方式

参数-choiceMode有以下三个可选值:

ListView.CHOICE_MODE_NONE:默认选择方式,如图-2所示。

ListView.CHOICE_MODE_SINGLE:单选按钮。

ListView.CHOICE_MODE_MULTIPLE:复选框。

8.2.4.示例

显示图-2的列表:

图-2

步骤1、按8.1.2的步骤在res/values文件夹下创建arrays.xml文件,在该文件中定义四个直辖市的名称。

步骤2、打开res/layout/main.xml文件,在该文件中定义ListView控件,如下代码所示:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<ListView

android:id="@+id/listView"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:entries="@array/citys"/>

</LinearLayout>

说明:以上代码中红框中的属性指定在列表中显示res/values/arrays.xml文件中数组名为citys的数组。

8.3.OnItemClick接口

8.3.1.概述

OnItemClick接口负责监听列表项单击事件。该接口在android.widget.AdapterView包下。

8.3.2.接口中声明的方法

onItemClick(AdapterView<?>parent,Viewview,intposition,longid)

作用:监听用户单击列表项的事件。

说明:

(1)第一个参数-parent:当前列表对象,如ListView对象。

(2)第二个参数-view:被单击的列表项对象。

(3)第三个参数-position:被单击的列表项在列表中的索引值。

(4)第四个参数-id:被单击的列表项在列表中所处的行的索引值。

大部分情况下,position与id的值相同。

8.3.3.【示例】

在Activity.onCreate()方法中调用8.2.3中定义的ListView,当单击了该列表中某项时,显示该项的标题,效果如图-3所示:

图-3

代码如下所示:

publicclassMainActextendsActivity{

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//实例化ListView控件

ListViewlistView=(ListView)findViewById(R.id.listView);

//定义列表项单击事件

listView.setOnItemClickListener(newOnItemClickListener(){

@Override

publicvoidonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

//获取索引值是position的列表项,转换为字符串

Stringtext=parent.getItemAtPosition(position).toString();

Toast.makeText(MainAct.this,text,3000).show();

}

});

}

}

说明:

以上代码中用的是内部匿名类的方式实现了OnIntemClickListener接口。

8.4.OnItemLongClick接口

8.4.1.概述

OnItemLongClick接口负责监听用户长按列表项的事件。该接口在android.widget.AdapterView包下。

8.4.2.接口中声明的方法

booleanonItemLongClick(AdapterView<?>parent,Viewview,

intposition,longid)

作用:监听用户长按列表项事件。

说明:各参数的作用参见8.3.2.

8.4.3.【示例】

当用户长按图-3中列表项时,显示该列表项标题,代码如下所示:

publicclassMainActextendsActivity

implementsOnItemClickListener{

//实现OnItemLongClickListener.onItemLongClick方法

@Override

publicbooleanonItemClick(AdapterView<?>parent,Viewview,

intposition,longid){

//获得被长按的列表项

Stringtext=parent.getItemAtPosition(position).toString();

Toast.makeText(MainAct.this,text,3000).show();

returnfalse;

}

说明:

以上采用的是MainAct类实现了OnItemClickListener接口,并实现了OnItemClick方法。这与8.2.4.的实现方式不同,但效果相同。

8.5.CheckedTextView控件

8.5.1.概述

CheckTextView控件专用于显示单选风格或复选风格的标签,该控件与ListView配合使用,可实现列表的单选/复选的风格。,如图-4所示:

图-4

8.5.2.常用属性

XML属性

说明

checkMark

设置ListView的选择行为标签的显示风格,有以下两个值:

(1)?android:attr/listChoiceIndicatorSingle

(2)?android:attr/listChoiceIndicatorMultipl

示例(1):设置单选风格显示,如下代码所示:

<CheckedTextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:checkMark="?android:attr/listChoiceIndicatorSingle">

</CheckedTextView>

示例(2);设置复选风格显示,如下代码所示:

<CheckedTextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:checkMark="?android:attr/listChoiceIndicatorMultiple">

</CheckedTextView>

示例(3)与ListView配合使用,在列表中显示单选风格按钮,效果如图-4所示。

步骤1、在res/layout文件夹下创建single_choice.xml文件,输入示例(1)所示代码。

步骤2、打开res/layout/main.xml,按以下代码中红框所示定义ListView控件:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<ListView

android:id="@+id/listView"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:choiceMode="singleChoice"/>

</LinearLayout>

示例(4)用代码方式设置单选风格

步骤1与示例(3)相同。

步骤2、将示例(3)步骤2中红框内走后一行代码删除(该行代码将用Java代码实现)。

步骤3、在Java代码中设置ListView列表单选风格,如下代码所示:

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ListViewListView=(ListView)findViewById(R.id.listView);

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

}

示例(5)设置复选风格的列表。

步骤1、在res/layout文件夹下创建single_choice.xml文件,输入示例(2)所示代码。

步骤2、打开res/layout/main.xml,按以下代码中红框所示定义ListView控件:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<ListView

android:id="@+id/listView"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:choiceMode="listChoiceIndicatorMultiple"/>

</LinearLayout>

示例(6)用Java代码设置复选风格的列表

步骤1与示例(5)的步骤1相同。

步骤2、将示例(5)红框中最后一行删除。

步骤3、在Java代码中设置ListView列表复选风格,如下代码所示:

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ListViewListView=(ListView)findViewById(R.id.listView);

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

}

8.5.3.重要提示

1、ListView中每一行只能有一个CheckedTextView,通过查看ArrayAdapter类的getView()方法,发现该方法从资源中获取布局对象后,强制转换为TextView类型,所以只能有一个CheckedTextView对象(因CheckedTextView类是TtextView的子类)。

2、必须设置CheckedTextView的checkMark属性值。

3、在Java代码中必须设置ListView的选择模式,否则即使布局中显示了单选/复选风格,但点击列表项时也无法响应点击事件。

8.6.ArrayAdapter类

8.6.1.概述

ArrayAdapter类:数组适配器类,该类负责将数组按指定布局方式显示,通过与ListView等控件相关联,在列表类型的控件中按指定布局样式显示数组中的数据。

8.6.2.创建ArrayAdapter对象

publicArrayAdapter(Contextcontext,inttextViewResourceId,T[]objects)

作用:创建ArrayAdapter对象。

说明:

参数-context:上下文对象,即当前窗口对象。

参数-textViewResourceId:标签控件的资源索引值。

参数-objects:数组。

8.6.3.【示例】

制作图-5所示效果,当长按列表项时,在屏幕下方显示该列表项标题。

图-5

步骤1、按8.1.2.所示的步骤在res/values文件夹中创建arrays.xml文件,在该文件中定义数组名为citys的数组。

步骤2、按8.5.2.中示例(1)和示例(3)创建单选风格的列表。

步骤3、在MainAct.java中,编写以下代码:

//本类实现了OnItemLongClickListener接口

publicclassMainActextendsActivityimplementsOnItemLongClickListener{

ListViewmListView;

ArrayAdaptermAdapter;//定义数组适配器

String[]mCitys;

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//步骤-1:实例化垂直列表控件

mListView=(ListView)findViewById(R.id.listView);

//步骤-2:创建资源管理对象

Resourcesres=getResources();

//步骤-3:获取资源中定义的字符串

mCitys=res.getStringArray(R.array.citys);

//步骤4-创建数组适配器对象,设置显示样式和显示的数据

mAdapter=newArrayAdapter<String>(this,

R.layout.single_choice,mCitys);

//步骤-5:设置列表与适配器对象相关联

mListView.setAdapter(mAdapter);

//步骤-6:设置单选按钮风格

mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

//步骤7-注册长按事件

mListView.setOnItemLongClickListener(this);

}

//步骤8-编写回调方法

//实现OnItemLongClickListener.onItemLongClick方法

@Override

publicbooleanonItemLongClick(AdapterView<?>parent,Viewview,

intposition,longid){

//获得被长按的列表项

Stringtext=(String)mListView.getItemAtPosition(position);

Toast.makeText(MainAct.this,text,3000).show();

returnfalse;

}

8.7.LayoutInflater类

8.7.1.概述

LayoutInflater类用于将资源中定义的布局或布局中的控件解析为Java的对象。

8.7.2.创建LayoutInflater对象

创建方式(1):Activity.getLayoutInflater(),通过该方法创建LayoutInflater对象。

示例:

LayoutInflaterinflater=getLayoutInflater();

创建方式(2):LayoutInflater.from(Activity.this);

示例:

LayoutInflaterinflater=LayoutInflater.from(this);

说明:this:这里是指当前的Activity对象。

8.7.3.常用方法

Viewinflate(intresource,ViewGrouproot)

作用:解析指定资源中的布局,返回结果是View类型的对象。

参数-resource:指定索引值的布局。

参数-root:第一个参数的父容器,若没有则写为null。

示例:以下是res/layout文件夹下定义的布局文件:listview_item.xml,该文件代码如下所示:

<?xmlversion="1.0"encoding="UTF-8"?>

<!--布局中若只有一个控件,可省略布局管理器的定义-->

<TextView

android:id="@+id/tvCity"

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content">

</TextView>

以下Java代码将该布局文件解析为TextView对象,并设置该对象的标题:

LayoutInflaterinflater=getLayoutInflater();

TextViewtvCityName=(TextView)

inflater.inflate(R.layout.listview_item,null);

//设置标签的标题

tvCityName.setText(这是解析的标签);

8.8.BaseAdapter

8.8.1.概述

BaseAdapter是ArrayAdapter的父类,该类是抽象类。通过创建该类的子类,可以灵活的设置适配器。以下通过分析该类结构,进一步理解ArrayAdapter的运行机制。

8.8.2.常用方法

1、publicViewgetView(intposition,ViewconvertView,ViewGroupparent)

作用:若当前列表的列表项未创建,则创建并返回列表项,包括列表项的显示样式和数据。

参数-position:当前列表项在列表中的索引值。

参数-convertView:当前列表项的View对象。

参数-parent:列表项的父容器对象-列表对象。

提示:该方法是抽象方法。

示例:以下代码创建一个标签对象,并返回该对象作为列表项:

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

//实例化标签对象

TextViewtvCityName=

(TextView)findViewById(R.layout.listview_item);

//设置标签的标题为数组中索引值为position(即当前列表项的索引值)的元素,

tvCityName.setText(mCityNames[position]);

returntvCityName;//返回标签对象

}

2、longgetItemId(intposition)

作用:返回当前列表项的索引值。

参数-position:当前列表项的索引值。

提示:该方法是抽象方法。

【示例代码】以下代码返回当前列表项的索引值

@Override

publiclonggetItemId(intposition){

returnposition;

}

3、ObjectgetItem(intposition)

作用:返回当前列表项对象,

参数-position:当前列表项的索引值。

提示:该方法是抽象方法。

【示例代码】

@Override

publicObjectgetItem(intposition){

returnmCityNames[position];

}

说明:mCityNames是一个字符串数组。以上代码返回该数组中的一个元素。

4、intgetCount()

作用:返回该列表的对象总数

提示:该方法是抽象方法。

示例代码:

@Override

publicintgetCount(){

returnmCityNames.length;

}

说明:以上方法返回数组的总长度,该数组的长度也就是列表项的个数。

8.8.3.【示例】

示例(1)在Activity类中定义一个方法:getAdapter,该方法创建并返回一个BaseAdapter类的对象。

代码如下所示:

//自定义getAdapter()方法,该方法返回一个ListAdapter类的对象

privateBaseAdaptergetAdapter(){

//定义一个继承自BaseAdapter的适配器类

BaseAdapteradapter=newBaseAdapter(){

//重写getView类,返回列表中的一个列表项对象

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

//创建布局解析器对象

LayoutInflaterinflater=getLayoutInflater();

//通过布局解析器创建标签对象

TextViewtvCityName=

(TextView)inflater.inflate(R.layout.listview_item,null);

//设置标签的标题为数组中索引值为position(即当前列表项的索引值)的元素,

tvCityName.setText(mCityNames[position]);

returntvCityName;//返回标签对象

}

@Override

publiclonggetItemId(intposition){

returnposition;

}

@Override

publicObjectgetItem(intposition){

returnmCityNames[position];

}

@Override

publicintgetCount(){

returnmCityNames.length;

}

};

returnadapter;//返回适配器对象

}

示例(2)定义一个具有ArrayAdapter类相同功能的适配器类。

//MyArrayAdapter类继承自BaseAdapter类

publicclassMyArrayAdapterextendsBaseAdapter{

//定义以下成员变量

ContextmContext;//上下文

intmResId;//布局的资源索引

String[]mStrings;//显示的数据

//构造方法,通过参数获得所需的上下文对象、布局的资源索引值和显示的数据

publicMyArrayAdapter(Contextcontext,intmResId,String[]mStrings){

super();

this.mContext=context;

this.mResId=mResId;

this.mStrings=mStrings;

}

//返回列表项的个数,即数组长度,该方法在构造方法执行后被调用

@Override

publicintgetCount(){

returnmStrings.length;

}

//获得列表项对象

@Override

publicObjectgetItem(intposition){

returnmStrings[position];

}

//获得列表项的索引值

@Override

publiclonggetItemId(intposition){

returnposition;

}

//创建并返回列表项,本方法现在只创建一个TextView对象

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

LayoutInflaterinflater=LayoutInflater.from(mContext);

TextViewtvCity=(TextView)inflater.inflate(mResId,null);

tvCity.setText(mStrings[position]);

returntvCity;

}

}

说明:

通过定义带形参的构造方法,MyArrayAdapter具有了一定的通用性,能通过外界传入的上下文对象、布局文件的资源索引值和数组中存放的数据完成ArrayAdpater类相同的功能。对照ArrayAdapter和MyArrayAdapter两个类的构造方法,我们发现参数是相同的,而且ArrayAdpater类也是BaseAdapter的子类。通过定义MyArrayAdapter类,我们对ArrayAdapter的实现原理有了进一步地认识。

8.9.SimpleAdapter类

8.9.1.概述

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

8.9.2.构造方法

图-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=newHashMap<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):

<?xmlversion="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”,这时候第四个参数表示为:

newString[]{“photoId”,”name”};

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

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

SimpleAdapteradapter=newSimpleAdapter(

this,data,R.layout.listview_item,

newString[]{"photoId","name"},

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

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

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

8.9.3.示例

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

publicclassMainActextendsActivity{

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

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

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

@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

initData();//初始化集合

//创建列表对象

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

/*创建SimpleAdapter对象

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

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

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

*第四个参数:键名数组

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

*/

SimpleAdapteradapter=newSimpleAdapter(

this,mList,R.layout.listview_item,

newString[]{"photoId","name"},

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

lvCity.setAdapter(adapter);

}

//初始化集合数据

privatevoidinitData(){

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

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=newHashMap<String,Object>();

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

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

mList.add(item);

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

item=newHashMap<String,Object>();

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

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

mList.add(item);

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

item=newHashMap<String,Object>();

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

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

mList.add(item);

}

8.10.自定义SimpleAdapter

8.10.1.概述

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

8.10.2.定义MySimpleAdapter类

publicclassMySimpleAdapterextendsBaseAdapter{

ContextmContext;//上下文

//存放数据的集合

List<Map<String,Object>>mList;

intmResId;//布局View的资源索引值

String[]mKey;//键名数组

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

//构造方法

publicMySimpleAdapter(ContextmContext,List<Map<String,Object>>mList,

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

super();

this.mContext=mContext;

this.mList=mList;

this.mResId=mResId;

this.mKey=mKey;

this.mResItemIds=mResItemIds;

}

//返回集合元素总数

@Override

publicintgetCount(){

returnmList.size();

}

//返回当前列表项

@Override

publicObjectgetItem(intposition){

returnmList.get(position);

}

//返回当前列表项的索引值

@Override

publiclonggetItemId(intposition){

returnposition;

}

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

@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

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

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

//获得布局布局对象

LinearLayoutll=(LinearLayout)LayoutInflater.from(

mContext).inflate(mResId,null);

//创建图像对象

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

//设置图片

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

//创建标签对象

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

//设置标签的标题

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

//返回布局对象

returnll;

}

}

说明:

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

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。

8.10.3.调用MySimpleAdapter类

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

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

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

//实例化列表对象

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

/*创建自定义的MySimpleAdapter对象

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

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

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

*第四个参数:键名数组

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

*/

MySimpleAdapteradapter=newMySimpleAdapter(

this,mList,R.layout.listview_item,

newString[]{photoId,name},

newint[R.id.ivCity,R.id.lvCity);

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

}


更多相关文章

  1. java/android 设计模式学习笔记(18)---中介者模式
  2. 2019年Android开发者常见面试题(一)
  3. 编写高效的Android代码 .
  4. android和javaEE更完美的通信-传递对象
  5. java/android 设计模式学习笔记(13)---享元模式
  6. Android内存溢出与优化(一)——不要随意new对象
  7. 【Tech-Android-Other】android操作sdcard中的多媒体文件——音
  8. [转]编写高效的Android代码
  9. Android(安卓)避免内存泄漏

随机推荐

  1. Android(安卓)studio 百度地图开发(9)只显
  2. Android(安卓)Patcher应用增量更新(App补
  3. Android拍照或从系统相册获取图片
  4. 番外篇 之 实现Unity和Android进行交互(基
  5. 如何让安卓(Android)子控件超出父控件的范
  6. Android进阶练习 - 高效显示Bitmap(高效加
  7. 《第一行代码——Android》封面诞生记
  8. [置顶] Android(安卓)使用Mockito测试业
  9. 【Android归纳决】回调机制在Android中的
  10. 关于Android(安卓)项目从svn中检出无R.ja