7.2 Android Basic UI的布局 ListView演示

<<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

       

posted @ 2011-03-25 17:05  敏捷学院  阅读(699)  评论(1编辑  收藏  举报