android学习笔记(30)列表视图(ListView 和 ListActivity )

文章标签: android,android-listview
2014-12-30 17:36:39     人阅读    

ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项。
创建ListView有两种方式:
> 直接使用ListView进行创建。
> 让 Activity 继承 ListActivity。
一旦在程序中获得了 ListView之后,接下来就需要为ListView设置它要显示的列表项了。 在这一点上,ListView与前面介绍的AutoComplete、Spinner类似,它们都需要一个供显示的 列表项,这就需要借助于内容Adapter 了,内容Adapter负责提供需要显示的列表项。
提示: 
AutoCompleteTextView、Spinner、ListView 采用 Adapter 提供数据的设计,其实就是 MVC 的典型应用,此时的 AutoCompleteTextView、Spinner、ListView 只 是View部分(实际上还包括Controller),它们只负责更新和显示,而显示的数 据则由Model部分(Adapter)提供。
ListView额外提供了如表2.17所示的常用XML属性。
表2.17 ListView的常用XML属性
XML属性                                                               说 明
android:choiceModc                                      设ListView的选择行为
android:divider                                              设定SList列表项的分隔条(既可用颜色分隔,也可川Drawable分隔)
android:dividerHeight                                    设置分隔条的度
android :entries                                              指定一个数组资源,Android将报据该数绀资源来生成ListView
android:footerDividersEnabled                       如果设置为false,则不在footer View之前绘制分秘条
androidiheadcrDividersEnabled                      如果设置为false,则不在header View之后绘制分隔条


下面通过几个实例来示范ListView的功能和用法。
实例:改变分隔条、基于数组的ListView
下面的界面布局中定义了两个ListView。
程序清单:codes\02\2.4\ArrayAdapterList\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"
 >
<!-- 直接使用数组资源给出列表项 -->
<ListView  
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:entries="@array/books"
 android:divider="@drawable/red"
 android:headerDividersEnabled="false"
 />
<!-- 使用ArrayAdapter提供列表项的ListView -->
<ListView  
 android:id="@+id/list2"
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:divider="@drawable/green"
 />
</LinearLayout>

          上面的界面布局中定义了两个List View,第一个ListView通过android:entries指定了列 表项数组,第二个List View通过Array Adapter使用数组来提供列表项。两个ListView都通过 andmididividei•改变了列表项之间的分隔条。


            上面第一个ListView指定了 android:entries=n@array/books",该属性值用到了数组资源, 因此还需要在应用中定义一个名为books的数组,定义数组的资源文件此处不再给出。
接下来程序需要为第二个ListView提供一个内容Adapter,这个Adapter决定ListView
所示的列表项。程序如下。
程序清单:codes\02\2.4\ArrayAdapterList\org\crazyit\listview\ArrayAdapterList.java

package org.crazyit.listview;

import org.crazyit.listview.R;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class ArrayAdapterList extends Activity
{ 
 @Override   
 protected void onCreate(Bundle savedInstanceState)
 {   
  super.onCreate(savedInstanceState);   
  setContentView(R.layout.main);   
  ListView list2 = (ListView)findViewById(R.id.list2);
  //定义一个数组
  String[] arr ={"孙悟空" , "猪八戒" , "牛魔王"};
  //将数组包装ArrayAdapter
  ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
   this , android.R.layout.simple_list_item_1 , arr);
  //为ListView设置Adapter
  list2.setAdapter(arrayAdapter); 
 }  
}

上面的程序中粗体字代码创建了一个ArrayAdapter,创建ArrayAdapter时必须指定一个 textViewResourceld,该参数决定每个列表项的外观形式。Android为该属性提供了如下属性值。
simplejist_item_1:每个列表项都是一个普通的TextView。
simplejist_item_2:每个列表项都是一个普通的TextView (字体略大)。
simpleJist_item_checked:每个列表项都是一个己勾选的列表项。
simpleJist」tem_multiple_choice:每个列表项都是带多选框的文本。
simpleJist_item_single_choice:每个列表项都是带多单选按钮的文本。
运行上面的程序看到如图2.40所示的界面。
如果将上面创建ArrayAdapter的代码改为使用如下代码:
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( this , android.R. simple jist_iteni__single一choice , arr) ?
则意味着ListView的每个列表项都是一个带单选按钮的文本

 

 

实例:基于ListActivity实现列表
如果程序的窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现, ListActivity的子类无须调用setContentView()方法来显示某个界面,而是可以直接传入一个内 容Adapter, ListActivity的子类就呈现出一个歹!J表。
例如如下程序。
程序清单:c〇des\02\2.4\ListActivityTest\src\org\crazyit\listactivity\ListActivityTest.java

package org.crazyit.listactivity;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
public class ListActivityTest extends ListActivity
{
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
//  //设置使用自己的界面布局
//  setContentView(R.layout.main);
  String[] arr = { "孙悟空", "猪八戒", "唐僧" };
  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
   android.R.layout.simple_list_item_multiple_choice, arr);
  // 设置该窗口显示列表
  setListAdapter(adapter);
 }
}

运行结果可以看出:ListActivity的默认 布局是由一个位于屏幕中心的列表组成的。实际上,开发 者完全可以在〇nCreate()方法中通过setContentView(int lay outld)方法设置用户的自定义的布局。
需要指出的是,在开发者指定的界面布局文件中应该 包含一个id为”@+id/android:list”(如果是使用代码的形 图2.42基于ListActivity的列表 式,则是android.R.id.list)的ListView。例如包含如下代
码片段:

<ListView android:id="@-t-id/android:list*
android:layout_width="match_parent" android:layout_height="match_parent• andro i d:background="# 0 0 0 0 f f" android:layout_weight="l■ android:drawSelectorOnTop="false"/>


实例:使用 SimpleAdapter 创建 ListView
正如前面介绍Spinner时看到的,如果开发者需要显示复杂的列表项一无论多么复杂, 只要开发者愿意实现自己的Adapter总可以做到——开发者重写BaseAdapter时提供的 getView方法即可作为列表的列表项。
但重写自己的Adapter毕竟是一件复杂的事情,实际上使用SimpleAdapter也可以自定义 ListView的列表项。
例如下面先定义如下界面布局文件。
程序清单:codes\02\2.4\SimpleAdapterTest\res\layout\main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/emdroid" android:orientations"vertical" android: 1 ayou t__width= ■ f i 1 l_par ent ■ android:layout一 heighfill_parent■
>
<!--定义一个 List -->
<ListView android:id="@+id/mylist■
android: layout一width= _ fill__parent" android: layout一height:= - wrap一content ■
/>
<!--定义一个ImageView,用于作为列表项的一部分。-->
<Ixoa9eView android:Ida110-t-id/header"
android:layout_width«"wrap_contant" android:layout_height»"wrap_content" android:paddingLe£t>"10dp"
/>
<!―定义一个TextView,用于作为列表项的一部分。-->
<TextView android:id«"9+id/name"
android: layout—width 駆"wrap-content •* android: layout_height» "wrap_content" androidstextSize«"16dp" android: gravity** "center 一vertical" android:paddingLefts_10dp"
/>
</LinearLayout>


上面的界面布局中定义了一个ImageView、一个TextView,这两个组件看上去和ListView 没有多大关系,但实际上我们可以通过SimpleAdapter将这两个组件组合在一起、它们整体 作为ListView的列表项。
下面是程序代码。
程序清单:codes\02\2.4\SimpleAdapterTest\src\oiig\crazyit\simpleadapterASimpleAd^terTesLjava

public class SimpleAdapterTest extends Activity private String[] names = new String[]
©Override
public void onCreate(Bundle savedlnstanceState)
{
super•onCreate(savedlnstanceState >; setContentView(R.layout.main);
//创建一个List集合,List集合的元素是Map
List<Map<String/ Object» listltems = new ArrayList<Map<String# Object» ();
for (int i = 0; i < names.length; i++)
{
Map<String, Object> listltem = new HashMap<String# Object>(); listltem.put("header"# imagelds[i]); listltem.put("personName", names[i]); listItems.add(listltem);
}
//创建一个 SimpleAdapter
SimpleAdapter simpleAdapter ■ new SimpleAdapter(this ,listltems ,R.layout.main
,new String[]{ "personName", "header" }
,new int[]{R.id.name , R.id.header));
ListView list = (ListView)findViewByld(R.id.mylist);
//为 ListView 设置 Adapter
list.setAdapter(simpleAdapter);


使用SimpleAdapter的最大难点在于创建SimpleAdapter对象,它需要5个参数,其中后
面4个参数十分关键。
第二个参数:该参数应该是一个List<? extends Map<String,?》类型的集合对象, 该集合中每个Map<String, ?>对象生成一个列表项。
 第三个参数:该参数指定一个界面布局的ID。例如此处指定了 R.layout.main,这意 味着使用/res/layout/main.xml文件作为界面布局。也就是第五个参数中的界面组件就 来自该界面布局。
第四个参数:该参数应该是一个String[】类型的参数, 该参数决定提取Map<String, ?>对象中那些key对应的 value来生成列表项。
第五个参数:该参数应该是一个int[]类型的参数,该参 数决定使用哪些View组件来组合成一个列表项。
从上面的程序看,listltems是一个长度为4的集合,这意味 着它生成的ListView将会包含4个列表项,每个列表项分别id 为 R.id.name (TextView)、R.id.header (ImageView)组成,其中 R.id.name 显示 listltem 集合元素(Map 对象)中 key 为 personName 的数据;R.id.header 的 Image View 显示 listltems 集合元素(Map 对象)中key为header的数据。


提示:

SimpleAdapter同样可作为ListActivity的内容Adapter,这样可以让用户方便 地定制ListActivity所显示的列表项。


原文地址:http://www.itmmd.com/201412/416.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

android学习笔记(31)可展开的列表组件(ExpandableListView )   上一篇
下一篇  android把头像位图处理成圆形
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!