Android控件学习笔记之 ListView
1.ListVeiw:用来展示列表的View。
2.适配器:用来把数据映射到ListView上的中介。
3.数据:具体的将被映射的字符串、图片,或者基本组件。
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。 SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
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的子类就呈现出一个列表。
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。
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
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;
}
}
<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
<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>
<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>