AndroidGUI18:ListView常用技巧

<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} -->

<!-- [endif]----><!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} --> <!-- [endif]---->

ListView AdapterView 的派生类, AdapterView ViewGroup 的派生类。

ListView 将需要显示的内容,放在一个可以垂直滚动的列表中进行显示。而要显示的内容是由和 ListView 相关联的 ListAdapter 指定的。通常是 ArrayAdapter 或者 CursorAdapter ,这两者都是 ListAdapter 的派生类。

因此 ArrayAdapter CursorAdapter 就是 ListView 的数据源。通常情况下,他们的主要区别是:

a. ArrayAdapter 用于指定数组中的数据,而 CursorAdapter 用于指定一个 Cursor 对象中的数据 ( 比如从数据库中查询得到的结果 )

b. ArrayAdapter 用于适合指定只有一列的数据,而 CursorAdapter 适合指定由多列的数据,但这点并不是很严格,也就是说 ArrayAdapter 也可以用于多列数据, CursorAdapter 也可以用于显示单列数据。

下面我们用实际的例子来说明。

第一个例子:

最简单的 ListView 用法。

1. 创建一个 Android Project ,修改其 main.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

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

android:id = "@+id/linearlayout"

android:orientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

>

<!-- layout 中增加一个 ListView -->

< ListView

android:id = "@+id/listview"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

/>

</ LinearLayout >

2. 修改 Activity 所对应的代码,使之如下:

package com.pat.gui;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

public class ControlListView extends Activity

implements

OnItemClickListener

{

// 声明一个 ListView 对象

private ListView listview ;

// 定义一个 String 数组 用以代表各种不同的手机操作系统

private String os [] = { "Android" , "iOS" , "Windows Phone" , "Symbian" ,

"BlackBerry" , "PalmOS" , "OPhone" , "Others..." };

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获得 ListView 对象

listview = (ListView) this .findViewById(R.id. listview );

// 定义一个 ArrayAdapter 对象 ArrayAdapter 有多个构造方法重载 其中下面用到的构造方法原型为

//public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

//context The current context.

//textViewResourceId The resource ID for a layout file containing a TextView to use

// when instantiating views.

//objects The objects to represent in the ListView.

ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , android.R.layout. simple_list_item_1 , os );

// android.R.layout.simple_list_item_1 Android 预先定义好的 我们自己也可以另外定义

listview .setAdapter(adapter); // adapter listview 关联起来

listview .setOnItemClickListener( this ); // listview 设置 OnItemClickListener

}

//@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

// parent The AdapterView where the click happened.

// view The view within the AdapterView that was clicked (this will be a view provided by the adapter)

// position The position of the view in the adapter.

// id The row id of the item that was clicked.

{

Toast.makeText ( this ,

"/"" + ((TextView)view).getText().toString() + "/". It's position is " + position,

Toast. LENGTH_SHORT ).show();

}

}

运行结果如下:

上面的 ListView 可以上下滚动。

AndroidGUI18:ListView常用技巧_第1张图片

点击 Symbian ,则会出现:

AndroidGUI18:ListView常用技巧_第2张图片

第二个例子:

自定义显示 ListView 中每行的 layout ,同时显示图片和文字。

1. res/layout 中,创建一个用于显示 ListView 条目的 layout 文件: rowlayout.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout

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

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:orientation = "horizontal" >

< ImageView

android:id = "@+id/row_icon"

android:layout_width = "60px"

android:layout_height = "80px"

android:src = "@drawable/icon"

/>

< TextView

android:id = "@+id/row_text"

android:layout_width = "wrap_content"

android:layout_height = "80px"

android:textSize = "30px"

android:textColor = "#0F0"

android:gravity = "center_vertical"

/>

</ LinearLayout >

其中的 ImageView 用于显示图片, TextView 用于显示文字。

2. 修改 Activity 所对应的代码,使之如下:

package com.pat.gui;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

public class ControlListView extends Activity

implements

OnItemClickListener

{

// 声明一个 ListView 对象

private ListView listview ;

// 定义一个代表手机操作系统的 String 数组

String[] os =

{

"Android" ,

"iOS" ,

"Windows Phone" ,

"Symbian" ,

"BlackBerry" ,

"PalmOS" ,

"OPhone" ,

"Other"

};

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获得 ListView 对象

listview = (ListView) this .findViewById(R.id. listview );

// 定义一个 ArrayAdapter 对象 ArrayAdapter 有多个构造方法重载 其中下面用到的构造方法原型为

// public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

// context The current context.

// resource The resource ID for a layout file containing a layout to use when instantiating views.

// textViewResourceId The id of the TextView within the layout resource to be populated

// objects The objects to represent in the ListView.

ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , R.layout. rowlayout , R.id. row_text , os );

listview .setAdapter(adapter); // adapter listview 关联起来

listview .setOnItemClickListener( this ); // listview 设置 OnItemClickListener

}

//@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

// parent The AdapterView where the click happened.

// view The view within the AdapterView that was clicked (this will be a view provided by the adapter)

// position The position of the view in the adapter.

// id The row id of the item that was clicked.

{

// 此处接收到的 view 就是我们在 rowlayout.xml 中定义的 LinearLayout

// 下面的语句用以获取其中的 TextView(ID row_text)

TextView tv = (TextView)view.findViewById(R.id. row_text );

Toast.makeText ( this , "/"" + tv.getText().toString() + "/". It's position is " + position,

Toast. LENGTH_SHORT ).show();

}

}

运行结果:

AndroidGUI18:ListView常用技巧_第3张图片

点击 Android ,得到:

AndroidGUI18:ListView常用技巧_第4张图片

在这个例子中,我们发现所有的图片都是一样的,要想图片和文字都不一样,请参考第三个例子。

第三个例子:

自定义 Adapter ,以控制如何显示 ListView 中的条目

1. 首先我们把各种手机操作系统的 logo ,拷贝到项目的 res/drawable-mdpi


他们对应的文件名分别为: android.png, ios.png, wp.png, symbian.png, blackberry.png, palm.png, ophone.png other.png

2. 修改 strings.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

< resources >

< string name = "hello" > Hello World, ControlListView! </ string >

< string name = "app_name" > AndroidGUI18 </ string >

< string name = "android" > Android </ string >

< string name = "ios" > iOS </ string >

< string name = "wp" > Windows Phone </ string >

< string name = "symbian" > Symbian </ string >

< string name = "palmos" > PalmOS </ string >

< string name = "blackberry" > BlackBerry </ string >

< string name = "ophone" > OPhone </ string >

< string name = "other" > Other </ string >

</ resources >

定义了各种手机操作系统的名称

3. 修改 Activity 所对应的代码,使之如下:

package com.pat.gui;

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

public class ControlListView extends Activity

implements

OnItemClickListener

{

// 声明一个 ListView 对象

private ListView listview ;

// 定义一个图片资源 ID 数组 代表各种手机操作系统的 logo

private int [] drawableIDs =

{

R.drawable. android ,

R.drawable. ios ,

R.drawable. wp ,

R.drawable. symbian ,

R.drawable. blackberry ,

R.drawable. palm ,

R.drawable. ophone ,

R.drawable. other

};

// 定义一个字符串 ID 数组 用以代表各种不同的手机操作系统名称 drawableIDs 有一一对应的关系

private int [] os =

{

R.string. android ,

R.string. ios ,

R.string. wp ,

R.string. symbian ,

R.string. blackberry ,

R.string. palmos ,

R.string. ophone ,

R.string. other

};

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获得 ListView 对象

listview = (ListView) this .findViewById(R.id. listview );

// 定义一个 ArrayAdapter 对象 ArrayAdapter 有多个构造方法重载 其中下面用到的构造方法原型为

//public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

//context The current context.

//textViewResourceId The resource ID for a layout file containing a TextView to use

// when instantiating views.

//objects The objects to represent in the ListView.

//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, os);

// android.R.layout.simple_list_item_1 Android 预先定义好的 我们自己也可以单独定义

// 现在我们使用自己定义的 Adapter

CustomizedAdapter adapter = new CustomizedAdapter();

listview .setAdapter(adapter); // adapter listview 关联起来

listview .setOnItemClickListener( this ); // listview 设置 OnItemClickListener

}

//@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

// parent The AdapterView where the click happened.

// view The view within the AdapterView that was clicked (this will be a view provided by the adapter)

// position The position of the view in the adapter.

// id The row id of the item that was clicked.

{

// 方法 onItemClick 中传递过来的 view CustomizedAdapter getView 返回的一个 LinearLayout 对象

TextView tv = (TextView)view.findViewWithTag( "tagTextView" ); // 得到相应的 TextView 对象

Toast.makeText ( this ,

"/"" + ((TextView)tv).getText().toString() + "/". It's position is " + position,

Toast. LENGTH_SHORT ).show();

}

// 内部类 自定义的 Adapter 重写 getCount getItem getItemId getView 方法。其中的 getView 方法最为重要

class CustomizedAdapter extends BaseAdapter // ArrayAdapter CursorAdapter 都是 BaseAdapter 的派生类

{

public int getCount()

{

return drawableIDs . length ;

}

public Object getItem( int position)

{

return drawableIDs [position];

}

public long getItemId( int position)

{

return position;

}

// 返回一个 LinearLayout 对象 其中包括一个 ImageView 和一个 TextView

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

{

// 先设定一个 LinearLayout 对象 ll

LinearLayout ll = new LinearLayout(ControlListView. this );

// 使 ll Orientation HORIZONTAL

ll.setOrientation(LinearLayout. HORIZONTAL );

// 在垂直方向居中

ll.setGravity(Gravity. CENTER_VERTICAL );

// 创建一个 ImageView 对象

ImageView iv = new ImageView(ControlListView. this );

// 指定对应 position Image

iv.setImageResource( drawableIDs [position]);

// 设定 ImageView 对象 iv 的宽度为 100 像素 高度为 50 像素

iv.setLayoutParams( new ViewGroup.LayoutParams(100, 60));

// iv 加入到 ll

ll.addView(iv);

// 创建一个 TextView 对象

TextView tv = new TextView(ControlListView. this );

// 指定对应 position Text

tv.setText( os [position]);

// 设定文字大小

tv.setTextSize(26);

// 设定文字颜色

if (position%2 == 0)

{

tv.setTextColor(Color. YELLOW );

}

else

{

tv.setTextColor(Color. GREEN );

}

// TextView 对象增加一个 Tag 以便在后续的处理中 可以通过

// findViewWithTag 方法来获取这个 TextView 对象

tv.setTag( "tagTextView" );

// tv 加入到 ll

ll.addView(tv);

return ll;

}

}

}

运行结果如下:

AndroidGUI18:ListView常用技巧_第5张图片

点击 Windows Phone ,得到的结果如下:

AndroidGUI18:ListView常用技巧_第6张图片

可以看到,我们同样能够获取到所选项目的文本信息。

其他操作和第一种情况一样。

<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]----><!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} --> <!-- [endif]---->

第四个例子:

在第三个例子的基础上,我们在每个 ListView 条目的最后增加一个 CheckBox ,即每一个 ListView 条目所包含的内容为:

ImageView TextView CheckBox

我们可以通过点击每个条目最后的 CheckBox ,在选中相关 ListView 中的条目。需要注意的地方:

+ CheckBox 外,不让 ListView 中的条目接受 Click 事件

+ ListView 中条目比较多 ( 比较多的意思是,比如,屏幕只能显示 6 个条目,而 ListView 中一共有 8 个条目,也就是说, ListView 的条目数量大于屏幕可以显示的条目数量 ) 的时候,有两个问题需要特别注意:

- 因为 ListView 可以在垂直方向滚动,那么总有一些条目是在屏幕上看不到的,这些看不到的条目,如果你试图用 ListView.GetChildAt(int position) 去获取它时,你会发现得到的结果将会是 null

- 要考虑到 CheckBox 的状态保持。比如程序开始运行后,在屏幕上显示 ListView 中的第 0~ 5 个条目,第 6 7 两个条目在屏幕上不可见,这时候,我们点击第 0 个条目的 CheckBox ,那么这个 CheckBox 就会被显示为 Checked 的状态,然后我们将整个 ListView 向下滚动到底,那么第 0 个条目就不可见了。如果我们再将整个 ListView 向上滚动到头,那么此时第 0 个条目又可见了,如果不做一些处理,我们将会发现,第 0 个条目对应的 CheckBox 本应该处于 Checked 状态,但在它重新出现时,居然自动变成了 unChecked 的状态。

+ 在这个例子中,我们采取第三个例子中自己定义一个 Adapter 的方式来进行相关的处理。所不同的是,在第三个例子中的 CustomizedAdapter.getView ,完全用代码实现返回的 View 及其 Layout ,以及其中所包含的 ImageView TextView 对象,而在这个例子中,我们准备先用 xml 文件,定义一个 xml 文件,用作 ListView 中每个条目的 View ,然后再通过 LayoutInflater inflate 方法,获取 getView 方法所需要返回的 View 对象。

下面开始描述具体的步骤:

1. 在第三例子项目的基础上,我们在 res/layout 文件夹中,创建一个 xml 文件: rowcheckboxlayout.xml ,如下:

AndroidGUI18:ListView常用技巧_第7张图片

这个 rowcheckboxlayout.xml 就是 ListView 中每个条目所需要用的 View 。编辑该 xml 文件,使其内容如下:

<? xml version = "1.0" encoding = "utf-8" ?>

<!-- 这次使用 RelativeLayout -->

< RelativeLayout

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

android:id = "@+id/row_checkbox_item"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:orientation = "horizontal" >

<!-- 用于显示图片 -->

< ImageView

android:id = "@+id/row_checkbox_icon"

android:layout_width = "48px"

android:layout_height = "80px"

/>

<!-- 用于显示文字,注意其相关的属性 -->

< TextView

android:id = "@+id/row_checkbox_text"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:textSize = "20px"

android:layout_toRightOf = "@id/row_checkbox_icon"

android:layout_marginLeft = "8px"

android:layout_centerVertical = "true" >

</ TextView >

<!-- 用于显示 ChechBox 注意其相关的属性 -->

< CheckBox

android:id = "@+id/row_checkbox"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:layout_marginLeft = "4px"

android:layout_marginRight = "10px"

android:layout_alignParentRight = "true"

android:layout_centerVertical = "true"

>

</ CheckBox >

<!--

android:focusable="false"

android:focusableInTouchMode="false"

如果想让 ListView 中的整个条目可以接收 click 事件,那么需要将

上面两个属性,加入到 CheckBox 对象的属性中即可。

-->

</ RelativeLayout >

2. 定义一个用于记录 ListView 条目状态的 POJO 类: ListItemData.java ,使其内容如下:

package com.pat.gui;

public class ListItemData

{

private int os_id ;

private int drawable_id ;

private boolean selected ;

public ListItemData( int os_id, int drawable_id)

{

this . os_id = os_id;

this . drawable_id = drawable_id;

selected = false ;

}

public int getOs_id()

{

return os_id ;

}

public void setOs_id( int osId)

{

os_id = osId;

}

public int getDrawable_id()

{

return drawable_id ;

}

public void setDrawable_id( int drawableId)

{

drawable_id = drawableId;

}

public boolean isSelected()

{

return selected ;

}

public void setSelected( boolean selected)

{

this . selected = selected;

}

}

3. 创建一个自定义的 Adapter 类,这次我们将自定义的 Adapter 独立出来存放于另外一个 Java 文件 CustomizedAdapter.java 中,而不是像再第三个例子那样,将 CustomizedAdapter 作为内部类。编辑 CustomizedAdapter.java ,使之如下:

package com.pat.gui;

import java.util.List;

import android.content.Context;

import android.graphics.Color;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.CompoundButton.OnCheckedChangeListener;

// 自定义的 Adapter 重写 getCount getItem getItemId getView 方法。其中的 getView 方法最为重要

class CustomizedAdapter extends ArrayAdapter<ListItemData>

{

// 声明一个 LayoutFlater 对象

private LayoutInflater inflater ;

private Context ctx ;

// 声明一个 List 对象 其元素的数据类型为 ListItemData 。因此这个 list 对象实际上

// 就是 ListView 对象的数据。

private final List<ListItemData> list ;

public CustomizedAdapter(Context ctx, List<ListItemData> list)

{

super (ctx, R.layout. rowcheckboxlayout , list);

this . ctx = ctx;

this . list = list;

inflater = (LayoutInflater)ctx.getSystemService(Context. LAYOUT_INFLATER_SERVICE );

}

public int getCount()

{

return list .size();

}

public ListItemData getItem( int position)

{

return list .get(position);

}

public long getItemId( int position)

{

return position;

}

// 返回一个 RelativeLayout 对象 其中包括一个 ImageView 、一个 TextView 以及一个 CheckBox

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

{

// getView 方法中的第二个参数 convertView 有时候可能会是 null 在这样的情况下

// 我们就必须创建一个新的 rowView(ListView 中每一个条目需要用到的 ) 。但是,如果

// convertView 不为 null 的时候,它是什么呢?它实际上就是前面通过 inflate 方法

// 得到的 rowView( 见下面代码 ) 。这种情况主要发生在 ListView 滚动的时候:当一个

// 新的条目 ( ) 出现的时候, Android 首先会试图重复使用被移除屏幕的那些条目所

// 对应的 rowView 对象。由于每一行都有相同的结构,因此可以通过 findViewById 方法

// 得到 rowView 中各个对象,根据相关的数据改变这些对象,然后将 contentView 对象

// 返回,而不需要重新构建一个 rowView 对象。

// 所以,在这里,我们先检查 convertView 是否为 null ,如果是 null 的,那么我们创建

// 一个新的 rowView ,否则,我们重用 convertView 。这样做可以大大减少耗时和耗资源

// inflate 的调用。根据 2010 Google I/O 大会,这样做比每次都 inflate 的做法的

// 性能快出 150% ,如果 rowView 包含的对象很复杂的话,快出 150% 也许都是低估了。

// 另外, 这样做,还可以节省内存。如果如下面重复利用业已存在的 rowView ,那么

// 仅需要 6 rowView 对象即可 ( 假定屏幕可以显示的行数是 6) ,假定每个 rowView 所占用的

// 内存是 6kB( 有图像的时候,超过这个数字很容易 ) ,那么一共需要的内存是 36kB 。如果不

// 采取这种重复利用的方式,在假定有 1000 行,那么所需要的内存就是 6MB 了,而且所需要

// 的内存和 ListView 中的行数有关,这本身也不符合可扩展性的原则,容易造成性能上

// 的不稳定。

final int pos = position;

View rowView = (View)convertView;

if (rowView == null )

{

rowView = (View) inflater .inflate(R.layout. rowcheckboxlayout , null , true );

}

// 获得 ImageView 对象

ImageView iv = (ImageView)rowView.findViewById(R.id. row_checkbox_icon );

// 指定对应 position Image

iv.setImageResource( list .get(pos).getDrawable_id());

// 获得 TextView 对象

TextView tv = (TextView)rowView.findViewById(R.id. row_checkbox_text );

// 指定对应 position Text

tv.setText( list .get(pos).getOs_id());

// 设定文字颜色

if (position%2 == 0)

{

tv.setTextColor(Color. YELLOW );

}

else

{

tv.setTextColor(Color. GREEN );

}

// TextView 对象增加一个 Tag 以便在后续的处理中 可以通过

// findViewWithTag 方法来获取这个 TextView 对象,注意 setTag 的参数可以是任意对象

tv.setTag( "tagTextView" );

// 获得 CheckBox 对象

CheckBox chkbox = (CheckBox)rowView.findViewById(R.id. row_checkbox );

// CheckBox 对象增加一个 Tag 以便在后续的处理中 可以通过

// findViewWithTag 方法来获取这个 TextView 对象,注意 setTag 的参数可以是任意对象

chkbox.setTag( "tagCheckBox" );

// CheckBox 设定 CheckedChangedListener

chkbox.setOnCheckedChangeListener( new OnCheckedChangeListener()

{

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

{

// 如果有 CheckBox 被点击了 ( 有可能是由 unchecked 变为 checked 也有可能是由 checked 变为 unchecked)

// 那么,我们在 list 中保存对应位置上的 CheckBox 的状态

list .get(pos).setSelected(isChecked);

String checkedItems = "The following items are checked:/n/n" ;

int j = 0; // 一个标记

// 根据 list 中记录的状态 输出 ListView 中对应 CheckBox 状态为 checked 的条目

for ( int i = 0; i < list .size(); ++i)

{

if ( list .get(i).isSelected())

{

// 通过 getString 方法 (Context 中定义的 ) 获取 id 对应的字符串

checkedItems += i + "/t" + ctx .getString( list .get(i).getOs_id()) + "/n" ;

++j;

}

}

if (j == 0)

{

checkedItems += "NO ITEM CHECKED." ;

}

Toast.makeText ( ctx , checkedItems, Toast. LENGTH_SHORT ).show();

}

});

// 下面这行特别重要 否则 ListView 中的 CheckBox 不能正常显示。

chkbox.setChecked( list .get(pos).isSelected());

return rowView;

}

}

4. 修改 Activity 所对应代码,使之如下:

( 下面代码中被注释的部分,曾想用 OnScrollListener 来处理 ListView 滚动时界面元素的重画,但由于 GetChildAt 可能返回 null ,而导致程序崩溃,详见下面 onScrollStateChanged 方法中的说明 )

package com.pat.gui;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

//import android.util.Log;

//import android.view.View;

//import android.widget.AdapterView;

//import android.widget.CheckBox;

import android.widget.ListView;

//import android.widget.AbsListView.OnScrollListener;

//import android.widget.AdapterView.OnItemClickListener;

public class ControlListView extends Activity

//implements

//OnItemClickListener

{

// 声明一个 ListView 对象

private ListView listview ;

private CustomizedAdapter adapter ;

// private int FIRST; // 用于记录在 ListView 停止滚动时,第一条在屏幕上可见的 item 的在 ListView 的位置

// private int VISIBLE; // 用于记录在屏幕上显示 item 的条数

// private int TOTAL; // ListView item 的数量

// 定义一个图片资源 ID 数组,代表各种手机操作系统的 logo

private int [] drawableIDs =

{

R.drawable. android ,

R.drawable. ios ,

R.drawable. wp ,

R.drawable. symbian ,

R.drawable. blackberry ,

R.drawable. palm ,

R.drawable. ophone ,

R.drawable. other

};

// 定义一个字符串 ID 数组 用以代表各种不同的手机操作系统名称 drawableIDs 有一一对应的关系

private int [] os =

{

R.string. android ,

R.string. ios ,

R.string. wp ,

R.string. symbian ,

R.string. blackberry ,

R.string. palmos ,

R.string. ophone ,

R.string. other

};

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获得 ListView 对象

listview = (ListView) this .findViewById(R.id. listview );

listview .setChoiceMode(ListView. CHOICE_MODE_MULTIPLE );

// 构造一个和 listview 对应的 list 对象。 list 用于保存 listview 中各 item 的状态。

final List<ListItemData> list = new ArrayList<ListItemData>();

for ( int i = 0; i < 8; ++i)

{

list.add( new ListItemData( os [i], drawableIDs [i]));

}

// 使用自定义的 Adapter

adapter = new CustomizedAdapter( this , list);

// adapter listview 关联起来

listview .setAdapter( adapter );

//listview.setOnItemClickListener(this);

//listview.setOnScrollListener(new OnScrollListener()

//{

// public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)

// {

// FIRST = firstVisibleItem;

// VISIBLE = visibleItemCount;

// TOTAL = totalItemCount;

// Log.e("111", "firstVisibleItem = " + firstVisibleItem + ", visibleItemCount = " +

// visibleItemCount + ", totalItemCount = " + totalItemCount);

// }

//

// public void onScrollStateChanged(AbsListView view, int scrollState)

// {

// View list_item;

// CheckBox chk_box;

// // scrollState 等于 0 的时候 也就是不滚动的时候 分别取出 FIRST VISIBLE TOTAL 的值

// if(scrollState == 0)

// {

// Log.e("111", "FIRST = " + FIRST + ", VISIBLE = " + VISIBLE + ", TOTAL = " + TOTAL);

//

// // 仅处理屏幕上可见的 item 但是 即便如此 view.getChildAt 还是有可能返回 null 从而导致程序崩溃。

// // 疑是 getChildAt bug 。而按道理而言,只要 item 在屏幕上可见,那么 view.getChildAt 不应该返回 null

// // 因此试图通过这种方式来重画 CheckBox 的状态,似乎不可行。

// for(int i = FIRST; i < (FIRST + VISIBLE); ++i)

// {

// list_item = (View)view.getChildAt(i);

// //if(list_item == null)continue;

//

// //if(list_item == null) break;

// //if((list.get(i).isSelected()) && (list_item != null) && (list_item.isShown() == true))

// if(list.get(i).isSelected())

// {

// chk_box = (CheckBox) list_item.findViewWithTag("tagCheckBox");

// chk_box.setChecked(true);

// }

// }

// }

// }

//});

}

//public void onItemClick(AdapterView<?> parent, View view, int position, long id)

//{

// Log.e("1", ""+position);

// View list_item = (View)parent.getChildAt(position);

// CheckBox chk_box = (CheckBox)list_item.findViewWithTag("tagCheckBox");

// chk_box.setChecked(true);

// adapter.notifyDataSetChanged();

//}

}

运行结果:

AndroidGUI18:ListView常用技巧_第8张图片

点击 Android iOS WindowsPhone 右边的 CheckBox 得到:

AndroidGUI18:ListView常用技巧_第9张图片

向下滚到到底,并点击 Other 右边的 CheckBox ,得到:

AndroidGUI18:ListView常用技巧_第10张图片

现在想上滚到到头,观察 Android iOS Windows Phone 右边的 CheckBox Checked 是否仍然被保持着:

AndroidGUI18:ListView常用技巧_第11张图片

可以看到状态保持得很好。

<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]----><!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} --> <!-- [endif]---->

第五个例子:

ListView Header Footer 有很多种做法。在这里我们只介绍一种比较简单,但非常有效的做法。我们将在 ListView 的上方增加一个固定的 Header( 即不随 ListView 的滚动而滚动 ) ,该 Header 实际上就是一个 Button ,当点击这个 Button 的时候,就显示 ListView 中的那些行被选中了。在第四个例子的基础上,具体做法如下:

1. 修改 main.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

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

android:id = "@+id/linearlayout"

android:orientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

>

<!-- ListView 之上 增加一个 Header 这个 Header 实际上就是一个 Button -->

< Button

android:id = "@+id/header"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

android:text = "HEADER"

android:textSize = "30px"

android:textColor = "#00F"

/>

<!-- layout 中增加一个 ListView -->

< ListView

android:id = "@+id/listview"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

/>

</ LinearLayout >

2. 修改 Activity 所对应的代码,使之如下:

package com.pat.gui;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.Toast;

public class ControlListView extends Activity

implements

OnClickListener

{

// 声明一个 ListView 对象

private ListView listview ;

private CustomizedAdapter adapter ;

// 定义一个图片资源 ID 数组 代表各种手机操作系统的 logo

private int [] drawableIDs =

{

R.drawable. android ,

R.drawable. ios ,

R.drawable. wp ,

R.drawable. symbian ,

R.drawable. blackberry ,

R.drawable. palm ,

R.drawable. ophone ,

R.drawable. other

};

// 定义一个字符串 ID 数组 用以代表各种不同的手机操作系统名称 drawableIDs 有一一对应的关系

private int [] os =

{

R.string. android ,

R.string. ios ,

R.string. wp ,

R.string. symbian ,

R.string. blackberry ,

R.string. palmos ,

R.string. ophone ,

R.string. other

};

private Button header ;

private List<ListItemData> list ;

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

listview = (ListView) this .findViewById(R.id. listview );

listview .setChoiceMode(ListView. CHOICE_MODE_MULTIPLE );

header = (Button) this .findViewById(R.id. header );

header .setOnClickListener( this );

// 构造一个和 listview 对应的 list 对象。 list 用于保存 listview 中各 item 的状态。

list = new ArrayList<ListItemData>();

for ( int i = 0; i < 8; ++i)

{

list .add( new ListItemData( os [i], drawableIDs [i]));

}

// 使用自定义的 Adapter

adapter = new CustomizedAdapter( this , list );

// adapter listview 关联起来

listview .setAdapter( adapter );

}

public void onClick(View v)

{

String tmpstr = "THE CHECKED ITEMS ARE:/n/n" ;

if (v.getId() == R.id. header )

{

for (ListItemData lid : list )

{

if (lid.isSelected())

{

tmpstr += this .getString(lid.getOs_id());

tmpstr += "/n" ;

}

}

}

Toast.makeText ( this , tmpstr, Toast. LENGTH_SHORT ).show();

}

}

其中粗体字的部分是新增加的代码。

3. 简化 CustomizedAdapter 的代码,使之如下:

package com.pat.gui;

import java.util.List;

import android.content.Context;

import android.graphics.Color;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.CompoundButton.OnCheckedChangeListener;

// 自定义的 Adapter 要重写 getCount getItem getItemId getView 方法。其中的 getView 方法最为重要

class CustomizedAdapter extends ArrayAdapter<ListItemData>

{

// 声明一个 LayoutFlater 对象

private LayoutInflater inflater ;

private Context ctx ;

// 声明一个 List 对象 其元素的数据类型为 ListItemData 。因此这个 list 对象实际上

// 就是 ListView 对象的数据。

private final List<ListItemData> list ;

public CustomizedAdapter(Context ctx, List<ListItemData> list)

{

super (ctx, R.layout. rowcheckboxlayout , list);

this . ctx = ctx;

this . list = list;

inflater = (LayoutInflater)ctx.getSystemService(Context. LAYOUT_INFLATER_SERVICE );

}

public int getCount()

{

return list .size();

}

public ListItemData getItem( int position)

{

return list .get(position);

}

public long getItemId( int position)

{

return position;

}

// 返回一个 RelativeLayout 对象 其中包括一个 ImageView 、一个 TextView 以及一个 CheckBox

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

{

// getView 方法中的第二个参数 convertView 有时候可能会是 null 在这样的情况下

// 我们就必须创建一个新的 rowView(ListView 中每一个条目需要用到的 ) 。但是,如果

// convertView 不为 null 的时候,它是什么呢?它实际上就是前面通过 inflate 方法

// 得到的 rowView( 见下面代码 ) 。这种情况主要发生在 ListView 滚动的时候:当一个

// 新的条目 ( ) 出现的时候, Android 首先会试图重复使用被移除屏幕的那些条目所

// 对应的 rowView 对象。由于每一行都有相同的结构,因此可以通过 findViewById 方法

// 得到 rowView 中各个对象,根据相关的数据改变这些对象,然后将 contentView 对象

// 返回,而不需要重新构建一个 rowView 对象。

// 所以,在这里,我们先检查 convertView 是否为 null ,如果是 null 的,那么我们创建

// 一个新的 rowView ,否则,我们重用 convertView 。这样做可以大大减少耗时和耗资源

// inflate 的调用。根据 2010 Google I/O 大会,这样做比每次都 inflate 的做法的

// 性能快出 150% ,如果 rowView 包含的对象很复杂的话,快出 150% 也许都是低估了。

// 另外, 这样做,还可以节省内存。如果如下面重复利用业已存在的 rowView ,那么

// 仅需要 6 rowView 对象即可 ( 假定屏幕可以显示的行数是 6) ,假定每个 rowView 所占用的

// 内存是 6kB( 有图像的时候,超过这个数字很容易 ) ,那么一共需要的内存是 36kB 。如果不

// 采取这种重复利用的方式,在假定有 1000 行,那么所需要的内存就是 6MB 了,而所需要

// 的内存和 ListView 中的行数有关,这本身也不符合可扩展性的原则,容易造成性能上

// 的不稳定。

final int pos = position;

View rowView = (View)convertView;

if (rowView == null )

{

rowView = (View) inflater .inflate(R.layout. rowcheckboxlayout , null , true );

}

// 获得 ImageView 对象

ImageView iv = (ImageView)rowView.findViewById(R.id. row_checkbox_icon );

// 指定对应 position Image

iv.setImageResource( list .get(pos).getDrawable_id());

// 获得 TextView 对象

TextView tv = (TextView)rowView.findViewById(R.id. row_checkbox_text );

// 指定对应 position Text

tv.setText( list .get(pos).getOs_id());

// 设定文字颜色

if (position%2 == 0)

{

tv.setTextColor(Color. YELLOW );

}

else

{

tv.setTextColor(Color. GREEN );

}

// TextView 对象增加一个 Tag 以便在后续的处理中 可以通过

// findViewWithTag 方法来获取这个 TextView 对象,注意 setTag 的参数可以是任意对象

tv.setTag( "tagTextView" );

// 获得 CheckBox 对象

CheckBox chkbox = (CheckBox)rowView.findViewById(R.id. row_checkbox );

// CheckBox 对象增加一个 Tag 以便在后续的处理中 可以通过

// findViewWithTag 方法来获取这个 TextView 对象,注意 setTag 的参数可以是任意对象

chkbox.setTag( "tagCheckBox" );

// CheckBox 设定 CheckedChangedListener

chkbox.setOnCheckedChangeListener( new OnCheckedChangeListener()

{

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)

{

// 如果有 CheckBox 被点击了 ( 有可能是由 unchecked 变为 checked 也有可能是由 checked 变为 unchecked)

// 那么,我们在 list 中保存对应位置上的 CheckBox 的状态

list .get(pos).setSelected(isChecked);

// CustomizedAdapter 此处的代码已经被简化掉

}

});

// 下面这行特别重要 否则 ListView 中的 CheckBox 不能正常显示。

chkbox.setChecked( list .get(pos).isSelected());

return rowView;

}

}

运行结果:

AndroidGUI18:ListView常用技巧_第12张图片

选中 Android iOs Windows Phone ,然后向下滚动到底,再选中 Other ,在滚动的过程中,我们发现 HEADER 并不会随 ListView 的滚动而滚动,同时, ListView 在滚动的过程中,每行的 CheckBox 的状态和第四个例子一样,也得到了很好的保持。点击 HEADER ,将会出现:

AndroidGUI18:ListView常用技巧_第13张图片

<!-- [if !mso]> <mce:style><!-- v/:* {behavior:url(#default#VML);} o/:* {behavior:url(#default#VML);} w/:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} --> <!-- [endif]----><!-- [if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:RelyOnVML/> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves>false</w:TrackMoves> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <mce:style><!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} --> <!-- [endif]---->

第六个例子:

前面五个例子都是使用 ArrayAdapter ,这个例子我们准备用 CursorAdapter

1. 创建一个新的项目,并修改 main.xml ,使之如下:

<? xml version = "1.0" encoding = "utf-8" ?>

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

android:id = "@+id/linearlayout"

android:orientation = "vertical"

android:layout_width = "fill_parent"

android:layout_height = "fill_parent"

>

<!-- layout 中增加一个 ListView -->

< ListView

android:id = "@+id/listview"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content"

/>

</ LinearLayout >

2. 再在 res/layout 中创建一个 xml 文件 (rowview.xml) ,用于显示 ListView 中的每一行

<? xml version = "1.0" encoding = "utf-8" ?>

< LinearLayout

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

android:orientation = "horizontal"

android:layout_width = "fill_parent"

android:layout_height = "wrap_content" >

< TextView

android:id = "@+id/tv_id"

android:layout_width = "60px"

android:layout_height = "wrap_content"

android:textSize = "30px"

android:text = ""

/>

< TextView

android:id = "@+id/tv_name"

android:layout_width = "wrap_content"

android:layout_height = "wrap_content"

android:textSize = "30px"

android:text = ""

/>

</ LinearLayout >

3. 创建一个自定的 Adapter ( 位于 CustomizedCursorAdapter.java) ,使之继承 CursorAdapter ,使其内容如下:

package com.pat.gui;

import android.content.Context;

import android.database.Cursor;

import android.view.LayoutInflater;

impor t android.view.View;

import android.view.ViewGroup;

import android.widget.CursorAdapter;

import android.widget.TextView;

public class CustomizedCursorAdapter extends CursorAdapter

{

public CustomizedCursorAdapter(Context ctx, Cursor c)

{

super (ctx, c);

}

// 必须重写 bindView 方法 其函数原型如下

//public abstract void bindView (View view, Context context, Cursor cursor)

//Bind an existing view to the data pointed to by cursor

//

//Parameters

//view Existing view, returned earlier by newView

//context Interface to application's global information

//cursor The cursor from which to get the data. The cursor is already moved to the correct position.

@Override

public void bindView(View v, Context ctx, Cursor cursor)

{

TextView tv_id = (TextView) v.findViewById(R.id. tv_id );

TextView tv_name = (TextView) v.findViewById(R.id. tv_name );

tv_id.setText(cursor.getString(0));

tv_name.setText(cursor.getString(1));

}

// 必须重写 newView 方法,其函数原型如下

//public abstract View newView (Context context, Cursor cursor, ViewGroup parent)

//Makes a new view to hold the data pointed to by cursor.

//

//Parameters

//context Interface to application's global information

//cursor The cursor from which to get the data. The cursor is already moved to the correct position.

//parent The parent to which the new view is attached to

@Override

public View newView(Context ctx, Cursor cursor, ViewGroup parent)

{

// 通过 LayoutInflater rowview.xml(R.layout.rowview)inflate 为一个 View 对象

LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context. LAYOUT_INFLATER_SERVICE );

View v = inflater.inflate(R.layout. rowview , parent, false );

// 获取 View 对象中定义的两个 TextView 对象

TextView tv_id = (TextView) v.findViewById(R.id. tv_id );

TextView tv_name = (TextView) v.findViewById(R.id. tv_name );

// Cursor 对象中的不同字段的数据,分别显示在上面的两个 TextView 对象中

tv_id.setText(cursor.getString(0)); // 显示 cursor 中的第一个字段

tv_name.setText(cursor.getString(1)); // 显示 cursor 中的第二个字段

return v; // 返回一个 View 对象,有可能会被 bindView 使用

}

}

注意,需要重写 newView bindView 两个方法。

4. 编辑 Activity 所对应的代码,使之如下:

package com.pat.gui;

import android.app.Activity;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.util.Log;

import android.view.View;

import android.widget.AdapterView;

import android.widget.CursorAdapter;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

public class ControlCusorAdapter extends Activity

implements

OnItemClickListener

{

private ListView listview ;

private Cursor cursor ;

@Override

public void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

setContentView(R.layout. main );

// 获取 main.xml 中定义的 ListView 对象 并为其设定 OnItemClickListener

listview = (ListView) this .findViewById(R.id. listview );

listview .setOnItemClickListener( this );

// 查询联系人数据库 并将结果保存在 cursor

cursor = getContacts();

// This method allows the activity to take care of managing the given Cursor's

// lifecycle for you based on the activity's lifecycle. That is, when the activity

// is stopped it will automatically call deactivate() on the given Cursor, and

// when it is later restarted it will call requery() for you. When the activity

// is destroyed, all managed Cursors will be closed automatically.

startManagingCursor( cursor );

// 创建一个 CustomizedCursorAdapter 对象

CursorAdapter adapter = new CustomizedCursorAdapter( this , cursor );

// adpater listview 关联起来

listview .setAdapter(adapter);

}

// 查询联系人数据库中所有联系人的 ID 和姓名,并俺姓名的升序进行排列

private Cursor getContacts()

{

// Run query

Uri uri = ContactsContract.Contacts. CONTENT_URI ;

String[] projection = new String[]

{

ContactsContract.Contacts. _ID ,

ContactsContract.Contacts. DISPLAY_NAME

};

String selection = null ;

String[] selectionArgs = null ;

String sortOrder = ContactsContract.Contacts. DISPLAY_NAME + " ASC" ;

return managedQuery(uri, projection, selection, selectionArgs, sortOrder);

}

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

{

// parent The AdapterView where the click happened.

// view The view within the AdapterView that was clicked (this will be a view provided by the adapter)

// 在我们这个例子中就是 CustomizedCursorAdapter newView 方法里面

// inflater.inflate(R.layout.rowview, parent, false) 的结果 rowview.xml 设定的内容

// position The position of the view in the adapter.

// id The row id of the item that was clicked.

Toast.makeText ( this ,

"/"" + ((TextView)view.findViewById(R.id. tv_name )).getText().toString() +

"/". It's position is " + position, Toast. LENGTH_SHORT ).show();

}

}

5. 最后要记得在 AndroidManifest.xml 中增加查询联系人数据库的权限

<? xml version = "1.0" encoding = "utf-8" ?>

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

package = "com.pat.gui"

android:versionCode = "1"

android:versionName = "1.0" >

< application android:icon = "@drawable/icon" android:label = "@string/app_name" >

< activity android:name = ".ControlCusorAdapter"

android:label = "@string/app_name" >

< intent-filter >

< action android:name = "android.intent.action.MAIN" />

< category android:name = "android.intent.category.LAUNCHER" />

</ intent-filter >

</ activity >

</ application >

< uses-sdk android:minSdkVersion = "8" />

< uses-permission android:name = "android.permission.READ_CONTACTS" />

</ manifest >

运行结果:

AndroidGUI18:ListView常用技巧_第14张图片

向下滚动到底,并点击 Isac Newton ,得到:

AndroidGUI18:ListView常用技巧_第15张图片

关于使用 CursorAdapter 的几点说明:

这个例子给出的 CursorAdapter 的用法是比较正规的用法,除此之外也可以使用 SimpleCursorAdapter ,要比这个例子简单些,但如果要实现前面几个例子中的效果,一般而言要采用本例所给出的做法。至于具体到增加诸如 CheckBox 类似这样的 feature ,可以参考前面的代码,大致情况相若。

最后要说明的, Activity 有一个派生类叫 ListActivity ,官方的解释是:

An activity that displays a list of items by binding to a data source such as an array or Cursor, and exposes event handlers when the user selects an item. ListActivity hosts a ListView object that can be bound to different data sources, typically either an array or a Cursor holding query results.

从上面的官方描述中,不难看出,一个 ListActivity 基本上等于在一个 Activity 里面 host 了一个 ListView ,从这点上看和我们前面做的事情几乎没有什么不同,只不过 ListActivity 已经把两者结合了起来,因此从使用的角度来看,应该更加简单一些。下面我们就举一个简单的例子来说明之。

第七个例子:

使用 ListActivity

创建一个新的项目,其他均无需改动,只需将 ListActivity 对应的代码修改,使之如下即可:

package com.pat.gui;

import android.app.ListActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.Toast;

public class ControlListActivity extends ListActivity

{

private String[] os = new String[]

{

"Android" ,

"iOS" ,

"Windows Phone" ,

"Symbian" ,

"BlackBerry" ,

"PalmOS" ,

"OPhone" ,

"Others..."

};

@Override

protected void onCreate(Bundle savedInstanceState)

{

super .onCreate(savedInstanceState);

// 创建一个 ArrayAdapter 对象 其中 android.R.layout.simple_list_item_1 Android 预先定义好的

// layout 的资源 ID 用于显示 ListView 中的每行数据。

ArrayAdapter<String> adapter = new ArrayAdapter<String>( this , android.R.layout. simple_list_item_1 , os );

// this( ListActivity 对象 ) Adapter 关联起来

this .setListAdapter(adapter);

}

// 重写 ListActivity 中的 onListItemClick 方法

@Override

protected void onListItemClick(ListView l, View v, int position, long id)

{

super .onListItemClick(l, v, position, id);

Object obj = this .getListAdapter().getItem(position);

String list_item = obj.toString();

Toast.makeText ( this , "/"" + list_item + "/" is selected, it's position is " + position, Toast. LENGTH_SHORT ).show();

}

}

运行结果:

AndroidGUI18:ListView常用技巧_第16张图片

向下滚动到底,并点击 Symbian ,得到:

AndroidGUI18:ListView常用技巧_第17张图片

所得结果和第一个例子相同,但可以看到使用 ListActivity ,代码显得更简单一些。

从第一个到第六个例子中对 ListView 适用的技巧,均可用于 ListActivity ,在此就不一一举例说明了。

你可能感兴趣的:(ListView)