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

本文详细介绍了在Android应用中使用GridView进行动态文字排版,包括配置GridView显示不同数量的文字项以及如何与ArrayAdapter配合使用。此外,还探讨了在Activity中显示列表的方法,包括使用ListView和ListActivity,并提供了相应的示例代码。文章最后还涉及了如何在ListActivity中整合Menu功能,以增强用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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

余额充值