Android第十二站 众多豪华控件 列表应用

 

 

目录

4.18 动态文字排版

 4.19 在Activity里显示列表

 

4.20 以动态列表配置选项

ListActivityMenu整合技巧

 

 

 

4.18 动态文字排版

范例说明

提到GridView这个Widget,就会令人联想到AdapterGridView是一个类似于“表格化”的二维排版配置View,当GridView里的元素多到画面放不下时,就会出现scrolling的效果,一般在GridView里的元素称为Item,要将文字作为Item放入GridView,就要借助ArrayAdapter对象。

这个范例将示范如何利用GridView来动态排版文字,事前在Layoutmain.xml)当中配置一个GridView WidgetmyGridView1),并设计两个按钮,作为动态放入GridView的开关。其中一个按钮设置GridView为两列样式,并放入4Item;另一个按钮则动态指定为3列样式,并放入9Item,以此达到利用GridView动态进行文字排版的效果。当要以二维表格显示未知元素(Item)个数的文字时,利用此法就可以轻松完成排版,且在GridView上也同样具有OnItemClickListener方法,可以捕捉UserGridView上单击的Item是什么。


范例程序

src/irdc.ex04_18/EX04_18.java

引用Android.widget.GridView后,便可在Activity当中声明GridView对象,利用findViewById()找到事先配放在Layoutmain.xml)上的GridView WidgetR.id.myGridView1)。

程序中有mButton01mButton02两个按钮对象,各自设置其OnClickListener,在按钮事件中处理要配置GridView的方法。GridViewsetNumColumns方法为设置其字段数量,为了方便配置GridView,使用了ArrarAdapterAndroid.widget.ArrayAdapter默认构造需要3个参数,并将初始化的ArrayAdapter对象aryAdapter1以调用GridView. setAdapter()的方式,将String类型的Item放入GridViewmGridView01)当中。

 

/* import程序略 */

 

  1. public class EX04_18 extends Activity
  2. {
  3.   private TextView mTextView01;
  4.   private Button mButton01,mButton02;
  5.   private GridView mGridView01;
  6.   private String[] mGames1,mGames2;
  7.   private ArrayAdapter<String> aryAdapter1;
  8.  
  9.   /** Called when the activity is first created. */
  10.   @Override
  11.   public void onCreate(Bundle savedInstanceState)
  12.   {
  13.     super.onCreate(savedInstanceState);
  14.     setContentView(R.layout.main);
  15.    
  16.     /* 4个字符串数组 */
  17.     mGames1 = new String[]
  18.                   {
  19.                     getResources().getString(R.string.str_list1),
  20.                     getResources().getString(R.string.str_list2),
  21.                     getResources().getString(R.string.str_list3),
  22.                     getResources().getString(R.string.str_list4)
  23.                   };
  24.    
  25.     /* 9个字符串数组 */
  26.     mGames2 = new String[]
  27.                   {
  28.                     getResources().getString(R.string.str_list1),
  29.                     getResources().getString(R.string.str_list2),
  30.                     getResources().getString(R.string.str_list3),
  31.                     getResources().getString(R.string.str_list4),
  32.                     getResources().getString(R.string.str_list1),
  33.                     getResources().getString(R.string.str_list2),
  34.                     getResources().getString(R.string.str_list3),
  35.                     getResources().getString(R.string.str_list4),
  36.                     getResources().getString(R.string.str_list1)
  37.                   };
  38.    
  39.     mButton01 = (Button)findViewById(R.id.myButton1);
  40.     mButton02 = (Button)findViewById(R.id.myButton2);
  41.     mGridView01 = (GridView)findViewById(R.id.myGridView1);
  42.    
  43.     mTextView01 = (TextView)findViewById(R.id.myTextView1);
  44.    
  45.     mButton01.setOnClickListener(new Button.OnClickListener()
  46.     {
  47.       @Override
  48.       public void onClick(View v)
  49.       {
  50.         // TODO Auto-generated method stub
  51.        
  52.         /* 4个元素,以2列方式显示(2x2) */
  53.         mGridView01.setNumColumns(2);
  54.        
  55.         aryAdapter1 = new ArrayAdapter<String>
  56.         (EX04_18.this, R.layout.simple_list_item_1_small, mGames1);
  57.        
  58.         mGridView01.setAdapter(aryAdapter1);
  59.         //mGridView01.setScrollBarStyle(DEFAULT_KEYS_DIALER);
  60.         mGridView01.setSelection(2);
  61.         mGridView01.refreshDrawableState();
  62.       }
  63.     });
  64.    
  65.     mButton02.setOnClickListener(new Button.OnClickListener()
  66.     {
  67.       @Override
  68.       public void onClick(View v)
  69.       {
  70.         // TODO Auto-generated method stub
  71.        
  72.         /* 9个元素,以3列方式显示(3x3) */
  73.         mGridView01.setNumColumns(3);
  74.        
  75.         aryAdapter1 = new ArrayAdapter<String>
  76.         (EX04_18.this, R.layout.simple_list_item_1_small, mGames2);
  77.        
  78.         mGridView01.setAdapter(aryAdapter1);
  79.       }
  80.     });
  81.    
  82.     mGridView01.setOnItemClickListener
  83.                (new GridView.OnItemClickListener()
  84.     {
  85.       @Override
  86.       public void onItemClick(AdapterView<?> parent,
  87.                               View v, int position, long arg3)
  88.       {
  89.         // TODO Auto-generated method stub
  90.        
  91.         /* 判断Adapter里的元素个数,判断被单击的是第几个元素名称 */
  92.         switch(aryAdapter1.getCount())
  93.         {
  94.           case 4:
  95.             /* positionGridView里的元素索引值 */
  96.             mTextView01.setText(mGames1[position]);
  97.             break;
  98.           case 9:
  99.             mTextView01.setText(mGames2[position]);
  100.             break;
  101.         }
  102.       }
  103.     });
  104.   }
  105. }
res/layout/simple_list_item_1_small.xml

放在layout下面的simple_list_item_1_small.xml,是用来配置ArrayAdapter第二个参数text- ViewResourceId,必须为TextView进行配置,若需要更改放入Item文字的模式,可以通过这个文件来进行文字大小、模式的属性设置,而一旦放入ArrayAdapter,这个配置就会立即生效;当然也可以设置许多的layout xml,并提供给不同的GridView来使用,以此让每一个GridView都有不同的风貌。

 

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

<TextView

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

  android:id="@+id/myCheckedTextView1"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:textColor="@drawable/blue"

  android:textSize="12sp"

  android:textAppearance="?android:attr/textAppearanceLarge"

  android:gravity="center_vertical"

  android:paddingLeft="6dip"

  android:minHeight="?android:attr/listPreferredItemHeight"

/>

扩展学习

既然谈到了ArrayAdapter,先来看看这个类的原型。

 

android.widget.ArrayAdapter.ArrayAdapter(Context context, int textViewResourceId, String[] objects)

 

android.widget.ArrayAdapter.ArrayAdapter需要传递3个参数才能构造,分别说明如表4-2所示。

4-2                                                      需传入的3个参数

Context context

现有程序的context

int textViewResourceId

要使用的Layout文件Resource ID,当中必须包含一个TextView

String[] objects

要放入的字符串数组

 

GridViewWidget XML属性名称及GridView对象的方法对应如表4-3所示。

4-3                                          XML属性名称及对应的对象方法

XML属性名称

对应的对象方法

android:columnWidth

setColumnWidth(int)

android:gravity

setGravity(int)

android:horizontalSpacing

setHorizontalSpacing(int)

android:numColumns

setNumColumns(int)

android:stretchMode

setStretchMode(int)

android:verticalSpacing

setVerticalSpacing(int)

 

最后来看看刚才构造ArrayAdapter时所使用的“simple_list_item_1_small.xml”,这个文件是提供给GridViewLayout配置,范例程序共使用了textColortextSizetextAppearance等属性,但其实只要利用以下的XML基本元素,就可以满足GridView可使用的ArrayAdapter TextView

 

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

<TextView

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

  android:layout_width="wrap_content"

  android:layout_height="wrap_content"

 

 

4.19 在Activity里显示列表

   

 

4.18 动态文字排版

范例说明

提到GridView这个Widget,就会令人联想到AdapterGridView是一个类似于“表格化”的二维排版配置View,当GridView里的元素多到画面放不下时,就会出现scrolling的效果,一般在GridView里的元素称为Item,要将文字作为Item放入GridView,就要借助ArrayAdapter对象。

这个范例将示范如何利用GridView来动态排版文字,事前在Layoutmain.xml)当中配置一个GridView WidgetmyGridView1),并设计两个按钮,作为动态放入GridView的开关。其中一个按钮设置GridView为两列样式,并放入4Item;另一个按钮则动态指定为3列样式,并放入9Item,以此达到利用GridView动态进行文字排版的效果。当要以二维表格显示未知元素(Item)个数的文字时,利用此法就可以轻松完成排版,且在GridView上也同样具有OnItemClickListener方法,可以捕捉UserGridView上单击的Item是什么。


范例程序

src/irdc.ex04_18/EX04_18.java

引用Android.widget.GridView后,便可在Activity当中声明GridView对象,利用findViewById()找到事先配放在Layoutmain.xml)上的GridView WidgetR.id.myGridView1)。

程序中有mButton01mButton02两个按钮对象,各自设置其OnClickListener,在按钮事件中处理要配置GridView的方法。GridViewsetNumColumns方法为设置其字段数量,为了方便配置GridView,使用了ArrarAdapterAndroid.widget.ArrayAdapter默认构造需要3个参数,并将初始化的ArrayAdapter对象aryAdapter1以调用GridView. setAdapter()的方式,将String类型的Item放入GridViewmGridView01)当中。

 

/* import程序略 */

 

  1. public class EX04_18 extends Activity
  2. {
  3.   private TextView mTextView01;
  4.   private Button mButton01,mButton02;
  5.   private GridView mGridView01;
  6.   private String[] mGames1,mGames2;
  7.   private ArrayAdapter<String> aryAdapter1;
  8.  
  9.   /** Called when the activity is first created. */
  10.   @Override
  11.   public void onCreate(Bundle savedInstanceState)
  12.   {
  13.     super.onCreate(savedInstanceState);
  14.     setContentView(R.layout.main);
  15.    
  16.     /* 4个字符串数组 */
  17.     mGames1 = new String[]
  18.                   {
  19.                     getResources().getString(R.string.str_list1),
  20.                     getResources().getString(R.string.str_list2),
  21.                     getResources().getString(R.string.str_list3),
  22.                     getResources().getString(R.string.str_list4)
  23.                   };
  24.    
  25.     /* 9个字符串数组 */
  26.     mGames2 = new String[]
  27.                   {
  28.                     getResources().getString(R.string.str_list1),
  29.                     getResources().getString(R.string.str_list2),
  30.                     getResources().getString(R.string.str_list3),
  31.                     getResources().getString(R.string.str_list4),
  32.                     getResources().getString(R.string.str_list1),
  33.                     getResources().getString(R.string.str_list2),
  34.                     getResources().getString(R.string.str_list3),
  35.                     getResources().getString(R.string.str_list4),
  36.                     getResources().getString(R.string.str_list1)
  37.                   };
  38.    
  39.     mButton01 = (Button)findViewById(R.id.myButton1);
  40.     mButton02 = (Button)findViewById(R.id.myButton2);
  41.     mGridView01 = (GridView)findViewById(R.id.myGridView1);
  42.    
  43.     mTextView01 = (TextView)findViewById(R.id.myTextView1);
  44.    
  45.     mButton01.setOnClickListener(new Button.OnClickListener()
  46.     {
  47.       @Override
  48.       public void onClick(View v)
  49.       {
  50.         // TODO Auto-generated method stub
  51.        
  52.         /* 4个元素,以2列方式显示(2x2) */
  53.         mGridView01.setNumColumns(2);
  54.        
  55.         aryAdapter1 = new ArrayAdapter<String>
  56.         (EX04_18.this, R.layout.simple_list_item_1_small, mGames1);
  57.        
  58.         mGridView01.setAdapter(aryAdapter1);
  59.         //mGridView01.setScrollBarStyle(DEFAULT_KEYS_DIALER);
  60.         mGridView01.setSelection(2);
  61.         mGridView01.refreshDrawableState();
  62.       }
  63.     });
  64.    
  65.     mButton02.setOnClickListener(new Button.OnClickListener()
  66.     {
  67.       @Override
  68.       public void onClick(View v)
  69.       {
  70.         // TODO Auto-generated method stub
  71.        
  72.         /* 9个元素,以3列方式显示(3x3) */
  73.         mGridView01.setNumColumns(3);
  74.        
  75.         aryAdapter1 = new ArrayAdapter<String>
  76.         (EX04_18.this, R.layout.simple_list_item_1_small, mGames2);
  77.        
  78.         mGridView01.setAdapter(aryAdapter1);
  79.       }
  80.     });
  81.    
  82.     mGridView01.setOnItemClickListener
  83.                (new GridView.OnItemClickListener()
  84.     {
  85.       @Override
  86.       public void onItemClick(AdapterView<?> parent,
  87.                               View v, int position, long arg3)
  88.       {
  89.         // TODO Auto-generated method stub
  90.        
  91.         /* 判断Adapter里的元素个数,判断被单击的是第几个元素名称 */
  92.         switch(aryAdapter1.getCount())
  93.         {
  94.           case 4:
  95.             /* positionGridView里的元素索引值 */
  96.             mTextView01.setText(mGames1[position]);
  97.             break;
  98.           case 9:
  99.             mTextView01.setText(mGames2[position]);
  100.             break;
  101.         }
  102.       }
  103.     });
  104.   }
  105. }
res/layout/simple_list_item_1_small.xml

放在layout下面的simple_list_item_1_small.xml,是用来配置ArrayAdapter第二个参数text- ViewResourceId,必须为TextView进行配置,若需要更改放入Item文字的模式,可以通过这个文件来进行文字大小、模式的属性设置,而一旦放入ArrayAdapter,这个配置就会立即生效;当然也可以设置许多的layout xml,并提供给不同的GridView来使用,以此让每一个GridView都有不同的风貌。

 

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

<TextView

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

  android:id="@+id/myCheckedTextView1"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:textColor="@drawable/blue"

  android:textSize="12sp"

  android:textAppearance="?android:attr/textAppearanceLarge"

  android:gravity="center_vertical"

  android:paddingLeft="6dip"

  android:minHeight="?android:attr/listPreferredItemHeight"

/>

扩展学习

既然谈到了ArrayAdapter,先来看看这个类的原型。

 

android.widget.ArrayAdapter.ArrayAdapter(Context context, int textViewResourceId, String[] objects)

 

android.widget.ArrayAdapter.ArrayAdapter需要传递3个参数才能构造,分别说明如表4-2所示。

4-2                                                      需传入的3个参数

Context context

现有程序的context

int textViewResourceId

要使用的Layout文件Resource ID,当中必须包含一个TextView

String[] objects

要放入的字符串数组

 

GridViewWidget XML属性名称及GridView对象的方法对应如表4-3所示。

4-3                                          XML属性名称及对应的对象方法

XML属性名称

对应的对象方法

android:columnWidth

setColumnWidth(int)

android:gravity

setGravity(int)

android:horizontalSpacing

setHorizontalSpacing(int)

android:numColumns

setNumColumns(int)

android:stretchMode

setStretchMode(int)

android:verticalSpacing

setVerticalSpacing(int)

 

最后来看看刚才构造ArrayAdapter时所使用的“simple_list_item_1_small.xml”,这个文件是提供给GridViewLayout配置,范例程序共使用了textColortextSizetextAppearance等属性,但其实只要利用以下的XML基本元素,就可以满足GridView可使用的ArrayAdapter TextView

 

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

<TextView

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

  android:layout_width="wrap_content"

  android:layout_height="wrap_content"

 

 

4.19 在Activity里显示列表

范例说明

应用程序继承自Activity之后,若要在页面里布局具有列表(List)效果的互动页面,那么就必须在Layout里添加ListView Widget,在这个范例里,放置了一个ListView列表,并设计两个事件ListenerOnItemSelectedListener事件为鼠标的滚轮转动时所选择的值;OnItemClickListener事件则为当鼠标单击时,所触发的事件。

本范例的学习重点在于判断ListView的“选择”以及“单击”两者之间的差异,并学会如何将列表选项放入到ListView当中。

范例程序

src/irdc.ex04_13/EX04_13.java

在添加ArrayAdapter里,使用ArrayAdapter(Context context, int textViewResourceId, T[] objects)这个构造器,其中textViewResourceId是定义在“res/layout/my_simple_list_item.xml”里的资源Resource IDR.layout.my_simple_list_item),里面所使用的组件为CheckedTextView,如此OnItem- ClickListener才可取得UserListView中选择的项目。

另外值得一提的是,范例程序示范了LinearLayout对象,动态地将TextViewListView“附加”进原有的Layout布局当中,程序语句LinearLayout.LayoutParams param1为创建LayoutParams对象param1,再调用myLinearLayout.addView(myTextView, param1);来将param1对象传入,达到动态配置TextView的结果。

 

/* import程序略 */

 

public class EX04_19 extends Activity

{

  private static final String[] array =

  {

    "sunday", "monday", "tuesday",

    "wednesday", "thursday", "friday",

    "saturday"

  };

 

  LinearLayout myLinearLayout;

  TextView myTextView;

  ListView myListView;

 

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

  @Override

  public void onCreate(Bundle savedInstanceState)

  {

    super.onCreate(savedInstanceState);

 

    /* 添加LinearLayout */

    myLinearLayout = new LinearLayout(this);

    myLinearLayout.setOrientation(LinearLayout.VERTICAL);

    myLinearLayout.setBackgroundColor(android.graphics.Color.WHITE);

 

    /* 添加TextView */

    myTextView = new TextView(this);

    LinearLayout.LayoutParams param1 = new LinearLayout.LayoutParams

    (

      LinearLayout.LayoutParams.FILL_PARENT,

      LinearLayout.LayoutParams.WRAP_CONTENT

    );

   

    myTextView.setText(R.string.title);

   

    myTextView.setTextColor(getResources().getColor(R.drawable.blue));

   

    /* TextView添加到myLinearLayout */

    myLinearLayout.addView(myTextView, param1);

   

    /* 添加ListView */

    myListView = new ListView(this);

    LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams

    (

      LinearLayout.LayoutParams.FILL_PARENT,

      LinearLayout.LayoutParams.WRAP_CONTENT

    );

   

    myListView.setBackgroundColor

    (getResources().getColor(R.drawable.ltgray));

   

    /* ListView添加到myLinearLayout */

    myLinearLayout.addView(myListView, param2);

   

    /* LinearLayout添加到ContentView */

    setContentView(myLinearLayout);

   

    /* new ArrayAdapter对象并将array字符串数组传入 */

    ArrayAdapter<String> adapter =

    new ArrayAdapter<String>

    (this, R.layout.my_simple_list_item, array);

   

    /* ArrayAdapter添加到ListView对象中 */

    myListView.setAdapter(adapter);

 

    /* myListView添加OnItemSelectedListener */

    myListView.setOnItemSelectedListener

    (new AdapterView.OnItemSelectedListener()

    {

      @Override

      public void onItemSelected

      (AdapterView<?> arg0, View arg1, int arg2, long arg3)

      {

        /* 使用getSelectedItem()将选择的值带入myTextView */

        myTextView.setText

        ("你选的是" + arg0.getSelectedItem().toString());

      }

     

      @Override

      public void onNothingSelected(AdapterView<?> arg0)

      {

        // TODO Auto-generated method stub

      }

    });

   

    /* myListView添加OnItemClickListener */

    myListView.setOnItemClickListener

    (new AdapterView.OnItemClickListener()

    {

      @Override

      public void onItemClick

      (AdapterView<?> arg0, View arg1, int arg2, long arg3)

      {

        /* 使用String[index]arg2为单击到ListViewindex

        并将值带入myTextView */

        myTextView.setText("你选的是" + array[arg2]);

      }

    });

  }

}

res/layout/my_simple_list_item.xml

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

<CheckedTextView

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

  android:id="@+id/myCheckedTextView1"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:textColor="@drawable/black"

/>

扩展学习

果希望选择一个以上的值,可以用ListView提供的setChoiceMode,传入的值有以下3种,如表4-4所示。

4-4                                                    3种常数所传入的值

   

 ListView.CHOICE_MODE_NONE

0

没有指定选择方式时

 ListView.CHOICE_MODE_SINGLE

1

最多一个

 ListView. ListView.CHOICE_MODE_MULTIPLE

2

多选

 

ArrayAdapter的构造器textViewResourceId传入Android.R.layout.simple_list_item_multiple_
choice
,代表ListView是可多选的,此时ListView需要setChoiceMode传入ListView. ListView.CHOICE_MODE_MULTIPLE2,即可做多选功能。

 

 

4.20 以动态列表配置选项

ListActivityMenu整合技巧

范例说明

至此之前所使用的应用程序,都是继承自Activity类所派生的范例(Android.app.Activity),本范例将介绍另一个与Activity不同的ListActivityAndroid.app.ListActivity),ListActivity类型的布局配置应用程序,常用来显示菜单列表、列表明细项目,假如让程序继承ListActivity,可以实现以下的方法,如表4-5所示。

4-5                                                      可实现的方法列表

getListAdapter()

取得目前列表项目的Adapter

getListView()

取得目前列表的View

续表

getSelectedItemId()

取得目前Keypad所选择的Item ID

getSelectedItemPosition()

取得目前Keypad所选择的Item索引值

onContentChanged()

ListActivity列表内容更动事件

onListItemClick(ListView, View, int, long)

User在列表项目单击触发事件

onRestoreInstanceState(Bundle)

当还原至此实例状态事件

setListAdapter(ListAdapter)

设置ListActivity的列表项目

setSelection(int)

设置所选择项目

 

ListActivity默认并不一定要像继承自Activity一样,必须使用setContentView来设置版型Layout才能显示页面,ListActivity可以在不必重写protected void onCreate(Bundle savedInstance State)的情况下,直接将列表加载至ListActivity中,非常便利,常用在如投票选项选择、多项目列表条列显示、文件资源管理器等。

本范例示范了在ListActivity中创建两个Menu菜单功能,一开始程序不会加载任何列表内容,所以程序运行后,画面是黑漆漆的一片,接着利用这两个Menu菜单功能,动态显示不同的列表项目到ListActivity上。而为了捕捉UserListActivity上的单击项目,重写了onListItemClick()方法来获取User单击的List Item项目,为了简化程序,输出改以Toast来提示,作为Item单击事件判断之用。

<!--[endif]-->

<!--[if !vml]-->

范例程序

src/irdc.ex04_20/EX04_20.java

你应该发现了主程序继承的对象从Activity换成了ListActivity,虽然该程序也重写了Activity里的onCreate()方法,但为了对照,在onCreate()中并没有任何的setContentView的描述。主程序重写了ListActivity才有的onListItemClick()方法,用以判断UserView上面所单击的事件,在其中取得单击的position位置(索引值),再通过mString[]字符串数组将其文字取出,最后以Toast输出。

两个类成员MENU_LIST1MENU_LIST2皆为整数,设置其为final的缘故,是因为要在onCreateOptionsMenu()使用新建Menu菜单之外,还需要在User单击事件后的onOptionsItem- Selected()里判断,初始化的常数值为Menu.FIRST0)以及Menu.FIRST+11),为后续判断User究竟是单击哪一个Menu菜单功能所设计的flag

 

/* import程序略 */

 

public class EX04_20 extends ListActivity

{

  private int selectedItem = -1;

  private String[] mString;

  static final private int MENU_LIST1 = Menu.FIRST;

  static final private int MENU_LIST2 = Menu.FIRST+1;

  private ArrayAdapter<String> mla;

 

  @Override

  protected void onCreate(Bundle savedInstanceState)

  {

    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);

  }

 

  @Override

  protected void onListItemClick

                 (ListView l, View v, int position, long id)

  {

    // TODO Auto-generated method stub

   

    selectedItem = position;

    Toast.makeText(EX04_20.this,

                   mString[selectedItem],

                   Toast.LENGTH_SHORT).show();

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

  }

 

  @Override

  public boolean onCreateOptionsMenu(Menu menu)

  {

    // TODO Auto-generated method stub

    /* menuID */

    int idGroup1 = 0;

   

    /* The order position of the item */

    int orderMenuItem1 = Menu.NONE;

    int orderMenuItem2 = Menu.NONE+1;

   

    menu.add(idGroup1, MENU_LIST1,

             orderMenuItem1, R.string.str_menu_list1);

    menu.add(idGroup1, MENU_LIST2,

             orderMenuItem2, R.string.str_menu_list2);

   

    return super.onCreateOptionsMenu(menu);

  }

 

  @Override

  public boolean onOptionsItemSelected(MenuItem item)

  {

    // TODO Auto-generated method stub

    switch(item.getItemId())

    {

      case (MENU_LIST1):

        mString = new String[]

                      {

                        getResources().getString(R.string.str_list1),

                        getResources().getString(R.string.str_list2),

                        getResources().getString(R.string.str_list3),

                        getResources().getString(R.string.str_list4)

                      };

       

        mla = new ArrayAdapter<String>(EX04_20.this, R.layout.main, mString);

        EX04_20.this.setListAdapter(mla);

        break;

      case (MENU_LIST2):

        mString = new String[]

                      {

                        getResources().getString(R.string.str_list5),

                        getResources().getString(R.string.str_list6),

                        getResources().getString(R.string.str_list7),

                        getResources().getString(R.string.str_list8)

                      };

        mla = new ArrayAdapter<String>(EX04_20.this, R.layout.main, mString);

        EX04_20.this.setListAdapter(mla);

        break;

    }

    return super.onOptionsItemSelected(item);

  }

 

}

res/layout/main.xml

请仔细观察这里的main.xml与过去的main.xml有何不同?里头并没有任何关于<Linear Layout><ListView>的描述。只有一个TextView,而且将xmlns:Android属性写在<TextView>当中,如果少了这一行,将导致编译错误。

 

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

<TextView

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

  android:id="@+id/myTextView1"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:text="@string/hello"

/>

扩展学习

本范例的学习重点在于如何在ListActivity当中,创建Menu菜单功能(重写onCreate- OptionsMenu()onOptionsItemSelected()方法),以及如何使用ArrayAdapter<String>setListAdapter方法,而此范例里的layout/main.xml,并非是用在重写onCreate()时的setContentView(),而是用在ArrayAdapter的构造当中,作为ListActivity列表项目的显示Layout

当然,假如想自定义ListActivity的布局Layout,同样也可以通过重写Activityon- Create方法来自定义布局,而不使用默认全屏幕的List列表画面,方法是先重写Activity里的onCreate()方法,在其中调用setContentView()方法,并将Layout传入。但请留意,在这个Layout设置文件中,必须包含一个ListViewWidget,否则将会导致程序运行时错误,如以下这个例子。

 

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

<LinearLayout

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:paddingLeft="8"

  android:paddingRight="8">

  <ListView

    android:id="@+id/android:list"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="#00FF00"

    android:layout_weight="1"

    android:drawSelectorOnTop="false"/>

  <TextView

    android:id="@+id/android:empty"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:background="#FF0000"

    android:text="no data"/>

</LinearLayout>

 

Layout当中配置一个ListView之外,还要指定其android:id值为“@+id/android:list”,以及所配置的TextViewID为“android:empty”,只要程序看到TextViewIDandroid:empty,就会隐藏这个Widget配置,如上述XML所示。

android.app.ListActivity的其他子类还有LauncherActivityPreferenceActivity

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值