在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
列表的显示需要三个元素:
1.ListVeiw:用来展示列表的View。
2.适配器:用来把数据映射到ListView上的中介。
3.数据:具体的将被映射的字符串、图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。 SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ArrayAdapter参数说明
ArrayAdapter(数组适配器)一般用于显示一行文本信息,所以比较容易。
构造函数
ArrayAdapter(Context context, int textViewResourceId)
ArrayAdapter(Context context, int resource, int textViewResourceId)
ArrayAdapter(Context context, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int textViewResourceId, List<T> objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
参数
context 运行着的视图的上下文。
textViewResourceId 一个包含了TextView的布局xml文件的id。
resource ListView中Item项的复杂布局xml文件。
objects 给ArrayAdapter提供数据的数组。
SimpleAdapter参数说明:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
构造函数
参数
context 关联SimpleAdapter运行着的视图的上下文。
data 一个Map的列表。在列表中的每个条目对应列表中的一行,应该包含所有在from中指定的条目
resource 一个定义列表项目的视图布局的资源唯一标识。布局文件将至少应包含哪些在to中定义了的名称。
from 一个将被添加到Map上关联每一个项目的列名称的列表
to 应该在参数from显示列的视图。这些应该全是TextView。在列表中最初的N视图是从参数from中最初的N列获取的值。
SimpleAdapter 可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,如果程序的窗口仅仅为了显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无需调用setContentView()来显示某个页面,而是可以直接传入一个Adapter,ListActivity的子类就呈现出一个列表。
SimpleCursorAdapter
SimpleCurosrAdapter 是一个将 Cursor 中的 columns 与在 XML 文件中定义的 TextViews 或 ImageViews 进行匹配的简易 adapter。你可以指定选择 Cursor 中的哪些 columns、用哪些 views 来显示这些 columns 、以及指定定义这些 views 的 xml 文件。 也就是说,SimpleCursorAdapter 允许绑定一个 Cursor 的 columns 到 ListView 上,并使用自定义的 layout 显示 List中的每个项目。可以使用 SimpleCursorAdapter 作为中间桥梁,将从 sqlite 数据库中查询出来的数据直接显示到 ListView 中。
public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
构造函数
参数
Context context 这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity。
layout 显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views。
c 数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null
from 指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null。
to 指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews。 "from" 参数的前 N 个值(valus)和 "to" 参数的前 N 个 views 是一一对应的关系。如果 cursor 无效,则该参数可为 null。
SimpleAdapter列子
Main.java
package
cn.test;
import
android.app.Activity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.widget.Button;
public
class
Main
extends
Activity {
private
Button btn_viewItemAndText;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
initControl();
setControlListener();
}
/**
* 初始化控件
*/
private
void
initControl(){
btn_viewItemAndText
=
(Button)findViewById(R.id.btn_viewItemAndText);
}
/**
* 增加控件监听
*/
private
void
setControlListener(){
btn_viewItemAndText.setOnClickListener(onClickViewItemAndTextListener);
}
/**
* 图文列表按钮事件
*/
private
View.OnClickListener onClickViewItemAndTextListener
=
new
View.OnClickListener() {
@Override
public
void
onClick(View v) {
Log.v(
"
OnClick
"
,
"
btn_viewItemAndText
"
);
Intent intent
=
new
Intent(Main.
this
, ItemAndTextListView.
class
);
startActivity(intent);
}
};
}
ItemAndTextListView.java
package
cn.test;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
android.app.ListActivity;
import
android.os.Bundle;
import
android.widget.SimpleAdapter;
public
class
ItemAndTextListView
extends
ListActivity {
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
SimpleAdapter adapter
=
new
SimpleAdapter(
this
,getData(),R.layout.listitem,
new
String[]{
"
ItemTitle
"
,
"
ItemText
"
},
new
int
[]{R.id.ItemTitle,R.id.ItemText});
setListAdapter(adapter);
}
private
List
<
Map
<
String, Object
>>
getData() {
List
<
Map
<
String, Object
>>
list
=
new
ArrayList
<
Map
<
String, Object
>>
();
Map
<
String, Object
>
map
=
new
HashMap
<
String, Object
>
();
map.put(
"
ItemTitle
"
,
"
项目标题1
"
);
map.put(
"
ItemText
"
,
"
项目文字 1
"
);
list.add(map);
map
=
new
HashMap
<
String, Object
>
();
map.put(
"
ItemTitle
"
,
"
项目标题2
"
);
map.put(
"
ItemText
"
,
"
项目文字 2
"
);
list.add(map);
map
=
new
HashMap
<
String, Object
>
();
map.put(
"
ItemTitle
"
,
"
项目标题3
"
);
map.put(
"
ItemText
"
,
"
项目文字 3
"
);
list.add(map);
return
list;
}
}
main.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<
TextView
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="@string/hello"
/>
<
Button
android:layout_height
="wrap_content"
android:id
="@+id/btn_viewItemAndText"
android:text
="标题加文字"
android:layout_width
="match_parent"
></
Button
>
</
LinearLayout
>
listitem.xml
<?
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
="fill_parent"
>
<
LinearLayout
android:orientation
="vertical"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
>
<
TextView
android:layout_height
="wrap_content"
android:layout_width
="fill_parent"
android:id
="@+id/ItemTitle"
android:textSize
="20dip"
>
</
TextView
>
<
TextView
android:layout_height
="wrap_content"
android:layout_width
="fill_parent"
android:id
="@+id/ItemText"
>
</
TextView
>
</
LinearLayout
>
</
LinearLayout
>
AndroidManifest.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
manifest
xmlns:android
="http://schemas.android.com/apk/res/android"
package
="cn.test"
android:versionCode
="1"
android:versionName
="1.0"
>
<
uses-sdk
android:minSdkVersion
="8"
/>
<
application
android:icon
="@drawable/icon"
android:label
="@string/app_name"
>
<
activity
android:name
=".Main"
android:label
="@string/app_name"
>
<
intent-filter
>
<
action
android:name
="android.intent.action.MAIN"
/>
<
category
android:name
="android.intent.category.LAUNCHER"
/>
</
intent-filter
>
</
activity
>
<
activity
android:name
=".ItemAndTextListView"
android:label
="@string/app_name"
>
<
intent-filter
>
<
action
android:name
="android.intent.action.itemAndTextListView"
/>
<
category
android:name
="android.intent.category.DEFAULT"
/>
</
intent-filter
>
</
activity
>
</
application
>
</
manifest
>