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 可以上下滚动。
点击 Symbian ,则会出现:
第二个例子:
自定义显示 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();
}
}
运行结果:
点击 Android ,得到:
在这个例子中,我们发现所有的图片都是一样的,要想图片和文字都不一样,请参考第三个例子。
第三个例子:
自定义 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;
}
}
}
运行结果如下:
点击 Windows Phone ,得到的结果如下:
可以看到,我们同样能够获取到所选项目的文本信息。
其他操作和第一种情况一样。
<!-- [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 ,如下:
这个 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();
//}
}
运行结果:
点击 Android 、 iOS 和 WindowsPhone 右边的 CheckBox 得到:
向下滚到到底,并点击 Other 右边的 CheckBox ,得到:
现在想上滚到到头,观察 Android 、 iOS 和 Windows Phone 右边的 CheckBox 的 Checked 是否仍然被保持着:
可以看到状态保持得很好。
<!-- [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;
}
}
运行结果:
选中 Android 、 iOs 、 Windows Phone ,然后向下滚动到底,再选中 Other ,在滚动的过程中,我们发现 HEADER 并不会随 ListView 的滚动而滚动,同时, ListView 在滚动的过程中,每行的 CheckBox 的状态和第四个例子一样,也得到了很好的保持。点击 HEADER ,将会出现:
<!-- [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 >
运行结果:
向下滚动到底,并点击 Isac Newton ,得到:
关于使用 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();
}
}
运行结果:
向下滚动到底,并点击 Symbian ,得到:
所得结果和第一个例子相同,但可以看到使用 ListActivity ,代码显得更简单一些。
从第一个到第六个例子中对 ListView 适用的技巧,均可用于 ListActivity ,在此就不一一举例说明了。