您的位置:首页 > 产品设计 > UI/UE

7.2 Android Basic UI的布局 ListView演示

2011-03-25 17:05 381 查看
<<ListViewDemo.zip>>

ListView演示

新建项目ListViewDemo,编辑res/layout/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="ListView演示" />

<Button android:text="单列ListView" android:id="@+id/Button01"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="双列ListView" android:id="@+id/Button02"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="没有数据的ListView" android:id="@+id/Button03"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<Button android:text="ListView操作" android:id="@+id/Button04"

android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

使用4个按钮分别演示ListView的4种状态。

2. 添加4个Activity 分别是ActivityList1,ActivityList2,ActivityList3,ActivityList4. 并在AndroidManifest.xml中配置Activity。

<activity android:name="ActivityList1"></activity>

<activity android:name="ActivityList2"></activity>

<activity android:name="ActivityList3"></activity>

<activity android:name="ActivityList4"></activity>

3. 关联Button事件到4个Activity,在ListViewDemo中添加如下代码:

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class ListViewDemo extends Activity {

/** Called when the activity is first created. */

private Button button1;

private Button button2;

private Button button3;

private Button button4;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//ActivityList1

button1 = (Button)findViewById(R.id.Button01);

button1.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ListViewDemo.this,ActivityList1.class);

startActivity(intent);

}

});

//ActivityList2

button2 = (Button)findViewById(R.id.Button02);

button2.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ListViewDemo.this,ActivityList2.class);

startActivity(intent);

}

});

//ActivityList3

button3 = (Button)findViewById(R.id.Button03);

button3.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ListViewDemo.this,ActivityList3.class);

startActivity(intent);

}

});

//ActivityList4

button4 = (Button)findViewById(R.id.Button04);

button4.setOnClickListener(new Button.OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent(ListViewDemo.this,ActivityList4.class);

startActivity(intent);

}

});

}

}



4. 基本的ListView使用ArrayAdapter来填充数据的演示(ActivityList1)

编辑ActivityList1类,代码如下:

import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class ActivityList1 extends Activity {

private ListView listView;

private String[] data={

"苹果取消iOS系统应用开发工具限制",

"谷歌苹果颤抖 十大微软WP7牛机谍照汇总 最快本月上市",

"2000元全键盘智能机推荐 用户关注度极高 ",

"电信校园营销扩张:教师可入网办学生套餐 ",

"HD7延续经典 六大品牌王牌系列机型逐个挑 引领前沿水平",

"摩托罗拉HTC领衔 市售电容屏智能机全推荐 ",

"N8携塞班卷土重来 Symbian系智能强机盘点 ",

"下歌仅需几秒钟 电信天翼无线WiFi实测"

};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setTitle("ActivityList1");

listView = new ListView(this);

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);

listView.setAdapter(adapter);

listView.setItemsCanFocus(true);

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

setContentView(listView);

}

}

ListView将要显示的数据定义在String数组当中.

listView = new ListView(this)创建了ListView对象。

使用ArrayAdapter加载数组中的数据,android.R.layout.simple_list_item_1 是系统定义布局资源表示ListView中的每一项只是简单的一个TextView。

listViewSetAdapter(adapter)方法会把ArrayAdapter中的数据显示出来。

Android系统默认的布局方式

android.R.layout.simple_list_item_1 每项只有一个TextView。

android.R.layout.simple_list_item_2 每项有两个TextView。

android.R.laout.simple_list_item_single_choice 每项有一个TextView但这一项可以被选择(RadioBox)。

android.R.layout.simple_list_item_checked 每项有一个TextView,但每项可以被选择(CheckedBox).



5. 使用SimpleAdapter显示两列数据(ActivityList2)

SimpleAdapter可以让ListView中的项更加个性化。通常ListView中的项的布局信息写在一个xml的布局文件中。

ArrayListAdapter是数组和ListView间的桥梁,SimpleAdapter是ArrayList和ListView的桥梁。但是这里的ArrayList中的每一项是一个Map<String,?>类型。

SimpleAdapter的构造函数。

SimpleAdapter(Context context,List<?extends Map<String,?>>data, int resource,String[] from,int[]to);

参数:

Content 上下文的引用。

Data 基于Map<String,?>类型的数组。

Resource layout中定义的资源,这个layout最少要包含to中出现的那些View.

From 名字数组,索引Map<String,Object>的Object用的。

To 是一个TextView数组,以id的形式表示。

编辑ActivityList2如下代码:

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ListView;

import android.widget.SimpleAdapter;

public class ActivityList2 extends Activity {

private ListView listView;

private List<Map<String,Object>> data;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setTitle("ActivityList2");

Init();

listView = new ListView(this);

//使用系统的layout显示一项

SimpleAdapter adapter = new SimpleAdapter(this,data,

android.R.layout.simple_list_item_1,

new String[]{"相机"},

new int[]{android.R.id.text1});

listView.setAdapter(adapter);

setContentView(listView);

}

private void Init(){

data = new ArrayList<Map<String,Object>>();

Map<String,Object> item;

item = new HashMap<String,Object>();

item.put("相机","三星 ST550");

item.put("特性","像素数:1220万 传感器尺寸:(1/2.33)英寸 光学变焦:4.6倍 等效于35mm焦距:27-124.2mm 显示屏尺寸:3.5英寸 防抖性能:光学防抖");

data.add(item);

item = new HashMap<String,Object>();

item.put("相机","佳能 G11");

item.put("特性", "光学变焦:5倍 等效于35mm焦距:28-140mm 显示屏尺寸:2.8英寸 防抖性能:光学防抖");

data.add(item);

item = new HashMap<String,Object>();

item.put("相机","尼康D90");

item.put("特性", "有效像素数:1000万 传感器尺寸:(1/2.4)英寸 光学变焦:5倍 等效于35mm焦距:24-120mm 显示屏尺寸:2.7英寸 防抖性能:光学防抖 ");

data.add(item);

item = new HashMap<String,Object>();

item.put("相机","索尼WX1");

item.put("特性", "像素数:1220万 传感器尺寸:(1/2.33)英寸 光学变焦:4.6倍 等效于35mm焦距:27-124.2mm 显示屏尺寸:3.5英寸 防抖性能:光学防抖");

data.add(item);

}

}

将数据的初始化放到了单独的成员方法Init()中。

SimpleAdapter adapter = new SimpleAdapter(this,data,

android.R.layout.simple_list_item_1,

new String[]{"相机"},

new int[]{android.R.id.text1});

使用系统的simple_list_item1来创建单列的listView。

From 和 to 参数的意思就是 将 "相机" 对应的数据 显示在 andorid.R.id.text1上。



更改一下adapter的创建,使用系统的layout显示两项数据:

SimpleAdapter adapter = new SimpleAdapter(this,data,

android.R.layout.simple_list_item_2,

new String[]{"相机","特性"},

new int[]{android.R.id.text1,android.R.id.text2}

);



使用自定的layout显示数据, 在res/layout新建 listitem.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">

<TextView android:id="@+id/mview1" android:layout_width="100px"

android:layout_height="wrap_content" />

<TextView android:id="@+id/mview2"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

</LinearLayout>

修改adapter的创建:

//使用自定义的layout显示数据

SimpleAdapter adapter = new SimpleAdapter(this,data,

R.layout.listitem,

new String[]{"相机","特性"},

new int[]{R.id.mview1,R.id.mview2}

);



处理ListView的事件,在onCreate()方法中添加如下代码:

//Listview的事件

listView.setOnItemClickListener(new ListView.OnItemClickListener(){

@Override

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

long id) {

// TODO Auto-generated method stub

Toast.makeText(ActivityList2.this, parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();

}

});

当ListView中的项被单击的时候会执行此代码,onItemClick是回凋函数,参数的意思是:

AdatperView<?> parent 是被单击的ListView

View view是选中的项

Int position 是选中的View在ListView当中的位置

Int id 是被选中哪一行的id.

getItemAtPosition()方法是获取这一行绑定的数据。



6. 使用ListActivity类来显示列表数据。 ListActivity也是一种ListView每一个ListActivity都和一个xml布局文件关联,布局文件基本上是固定的模式。

在res/layout下新建布局文件list3.xml:

<LinearLayout

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

android:layout_width="wrap_content"

android:layout_height="wrap_content">

<ListView android:id="@id/android:list"

android:layout_width="fill_parent"

android:layout_height="fill_parent"/>

<TextView android:id="@id/android:empty"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="没有数据"/>

</LinearLayout>

定义了一个ListView, id是系统预设的 "@id/andorid:list", 另外定义了一个 TextView用来显示空数据的提示,id也是系统预设的 "@id/android:empty"。

修改ActivityList3的代码如下:

public class ActivityList3 extends ListActivity {

private String[] data = {};

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setTitle("ActivityList3");

setContentView(R.layout.list3);

ArrayAdapter adapter = new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, data);

setListAdapter(adapter);

}

}

使用ArrayAdapter 关联数据,使用系统内置的simple_list_item1. setListAdapter()方法显示adapter中的数据。



给数组添加数据:

private String[] data = {"abc","def","kkkk"};

ListView的事件处理,在ListActivity类中重写onListItemClick方法:

//重写,处理单击事件

@Override

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

// TODO Auto-generated method stub

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

Toast.makeText(this, l.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();

}



7. ListView不仅仅有OnItemClickListener事件,还有OnItemSelectedListener事件,当某项被选中的时候触发。

将列表数据写到res/string.xml中

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

<resources>

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

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

<string-array name="list_data">

<item>list1</item>

<item>list2</item>

<item>list3</item>

<item>list4</item>

<item>list5</item>

<item>list6</item>

</string-array>

</resources>

修改ActivityList4的代码:

public class ActivityList4 extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setTitle("ActivityList4");

ListView listView = new ListView(this);

String []data = getResources().getStringArray(R.array.list_data);

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);

listView.setAdapter(adapter);

setContentView(listView);

listView.setOnItemSelectedListener(new ListView.OnItemSelectedListener(){

@Override

public void onItemSelected(AdapterView<?> parentView, View view,

int position, long id) {

// TODO Auto-generated method stub

Toast.makeText(ActivityList4.this, "选中"+parentView.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();

}

@Override

public void onNothingSelected(AdapterView<?> arg0) {

// TODO Auto-generated method stub

}

});

}

}



im@xingquan.org
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: