- 列表视图(ListView)和ListActivity
提示:ListView、GridView、Spinner、Galley等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。
AbsListView的常用属性和相关方法见下表:
属性 |
相关方法 |
说明 |
android:choiceMode |
设置AbsListView的选择方式: singleChoice:允许单选 multipleChoice:允许多选 multipleChoiceModal:允许多选 |
|
android:drawSelectorOnTop | setDrawSelectorOnTop(boolean) | 如果该属性设置为true,选中的列表项将会显示在上面 |
android:fastScrollEnabled | 设置是否允许快速滚动。如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。 | |
android:listSelector | setSelector(int) | 指定被选中的列表项上绘制的Drawable |
android:scrollingCache | 如果设置为true,则在滚动时将会使用缓存 | |
android:smoothScrollbar | setSmoothScrollbarEnabled(boolean) | 如果设置为false,则不在header View之后绘制分隔条 |
android:stackFromBottom | 设置是否从底端开始排列列表项 | |
android:textFilterEnabled | 设置是否对列表项进行过滤。只有当该AdapterView对应的Adapter实现了Filter接口时该属性才会作用。 | |
android:transcriptMode | 设置组件的滚动模式: disabled:关闭滚动(默认) normal:当该AbsListView收到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端。 alwaysScroll:该AbsListView总会自动滚动到底端 |
ListView提供的属性如下表:
属性 |
说明 |
android:divider | 设置List列表项的分隔条(可用颜色分隔,也可用drawable对象分隔) |
android:dividerHeiht | 设置分隔条的高度 |
android:entries | 指定一个数组资源,Android将根据该数组资源来生成ListView |
android:footerDividerEnabled | 如果设置成false,则不在footer View之前绘制分隔条 |
andorid:headerDividerEnabled | 如果设置成false,则不再header View之前绘制分隔条 |
- Adapter接口及实现类
ArrayAdapter(列表项只能是TextView) ①布局文件里:<ListView ... android:id="@+id/listview" />②Java段内需要一个数组或者list集合
③//将数组包装为ArrayAdapterArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.array_item, array); 参数:Context, TextViewResourceId(布局文件,里面包含一个TextView,自己设置显示的格式), 数组或list ListActivity public class MainActivity extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 无须使用布局文件 setContentView() String[] arr = { "孙悟空", "猪八戒", "唐僧" }; // 创建ArrayAdapter对象 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, arr); // 设置该窗口显示列表 setListAdapter(adapter); 0000000 }} SimpleAdapter(更复杂的列表项使用SimpleAdapter) public class MainActivity extends Activity {
private String[] names = new String[] { "虎头", "弄玉", "李清照", "李白"}; private String[] descs = new String[] { "可爱的小孩", "一个擅长音乐的女孩" , "一个擅长文学的女性", "浪漫主义诗人"}; private int[] imageIds = new int[] { R.drawable.tiger , R.drawable.nongyu , R.drawable.qingzhao , R.drawable.libai};
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //main.xml布局里面有一个ListView项, id=mylist // 创建一个List集合,List集合的元素是Map List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); //添加数据到集合中 for (int i = 0; i < names.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); listItem.put("header", imageIds[i]); listItem.put("personName", names[i]); listItem.put("desc", descs[i]); listItems.add(listItem); }
// 创建一个SimpleAdapter SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.simple_item,. new String[] { "personName", "header" , "desc"}, new int[] { R.id.name, R.id.header , R.id.desc });
参数: 第2个:List<Map<String, Object>> 第3个:simple_item布局里面就是图片和两句文字的具体显示 第4个:String[] 是Map<String, ?>里面的key 第5个:int[]决定填充哪些组件---simple_item布局里面图片和文字对应的id
ListView mylist = (ListView) findViewById(R.id.mylist); // 为ListView设置Adapter mylist.setAdapter(simpleAdapter);
// 为ListView的列表项的单击事件绑定事件监听器 list.setOnItemClickListener(new OnItemClickListener() { // 第position项被单击时激发该方法 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { System.out.println(names[position] + "被单击了"); } });
// 为ListView的列表项的选中事件绑定事件监听器 list.setOnItemSelectedListener(new OnItemSelectedListener() { // 第position项被选中时激发该方法 @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { System.out.println(names[position] + "被选中了"); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); }} 扩展BaseAdapter实现不存储列表项的ListView public class MainActivity extends Activity { ListView myList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myList = (ListView) findViewById(R.id.myList); //main.xml中ListView项的ID BaseAdapteradapter = new BaseAdapter() { @Override publicint getCount() { // 返回值控制该Adapter将会包含多少个列表项
// 指定一共包含40个选项 return 40; }
@Override publicObject getItem(int position) { // 返回值决定第position处的列表项的内容
return null; } @Override publiclong getItemId(int position) { // 返回值将作为列表项的ID return position; } @Override publicView getView(int position , View convertView , ViewGroup parent) { // 返回的View将作为列表框 LinearLayout line =new LinearLayout(MainActivity.this); line.setOrientation(0); ImageView image =new ImageView(MainActivity.this); image.setImageResource(R.drawable.ic_launcher); TextView text =new TextView(MainActivity.this); text.setText("第" + (position +1 ) + "个列表项"); text.setTextSize(20); text.setTextColor(Color.RED); line.addView(image); line.addView(text); // 返回LinearLayout实例 return line; } }; myList.setAdapter(adapter); }}
- 自动完成文本框(AutoCompleteTextView)的功能及用法
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 创建一个ArrayAdapter,封装数组 ArrayAdapter<String> aa = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_it em_1line, books); actv = (AutoCompleteTextView)findViewById(R.id.auto); // 设置Adapter actv.setAdapter(aa); mauto = (MultiAutoCompleteTextView)findViewById(R.id.mauto); // 设置Adapter mauto.setAdapter(aa); // 为MultiAutoCompleteTextView设置分隔符 mauto.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); }}
- 网格视图(GridView)的功能及用法
属性名称 |
描述 |
android:columnWidth |
设置列的宽度。关联的方法为:setColumnWidth(int) |
android:gravity |
设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical 可以多选,用“|”分开。关联方法:setGravity (int gravity) |
android:horizontalSpacing |
两列之间的间距。关联方法:setHorizontalSpacing(int) |
android:numColumns |
列数。关联方法:setNumColumns(int) |
android:stretchMode |
缩放模式。关联方法:setStretchMode(int) |
android:verticalSpacing |
两行之间的间距。关联方法:setVerticalSpacing(int) |
int[]imageIds = new int[] { R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7 , R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10 , R.drawable.bomb11 , R.drawable.bomb12 , R.drawable.bomb13 , R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16 };
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 创建一个List对象,List对象的元素是Map List<Map<String, Object>> listItems= new ArrayList<Map<String, Object>>(); for (int i = 0; i < imageIds.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); listItem.put("image", imageIds[i]); listItems.add(listItem); } // 获取显示图片的ImageView imageView = (ImageView) findViewById(R.id.imageView); // 创建一个SimpleAdapter SimpleAdapter simpleAdapter= new SimpleAdapter(this, listItems // 使用/layout/cell.xml文件作为界面布局 <!--cell里面一个ImageView的图片--> , R.layout.cell, new String[] { "image" }, new int[] { R.id.image1 }); grid = (GridView) findViewById(R.id.grid01); // 为GridView设置Adapter grid.setAdapter(simpleAdapter); // 添加列表项被选中的监听器 grid.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 显示当前被选中的图片 imageView.setImageResource(imageIds[position]); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // 添加列表项被单击的监听器 grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 显示被单击的图片 imageView.setImageResource(imageIds[position]); } }); }}
- 可展开的列表组件(ExpandableListView)
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //创建一个BaseExpandableListAdapter对象 ExpandableListAdapter adapter =new BaseExpandableListAdapter() { int[]logos = new int[] { R.drawable.p, R.drawable.z, R.drawable.t }; private String[]armTypes = new String[] { "神族兵种", "虫族兵种", "人族兵种"}; private String[][]arms = new String[][] { { "狂战士", "龙骑士", "黑暗圣堂", "电兵" }, { "小狗", "刺蛇", "飞龙", "自爆飞机" }, { "机枪兵", "护士MM" , "幽灵" } }; @Override public ObjectgetChild(int groupPosition, int childPosition) { // 获取指定组位置、指定子列表项处的子列表项数据 return arms[groupPosition][childPosition]; } @Override public longgetChildId(int groupPosition, int childPosition) { return childPosition; } @Override public intgetChildrenCount(int groupPosition) { // 特定组所包含的子列表项的数量 return arms[groupPosition].length; }
private TextViewgetTextView() { AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 64); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(36, 0, 0, 0); textView.setTextSize(20); return textView; } @Override public ViewgetChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // 该方法决定每个子选项的外观 TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition) .toString()); return textView; } @Override public ObjectgetGroup(int groupPosition) { // 获取指定组位置处的组数据 return armTypes[groupPosition]; } @Override public intgetGroupCount() { // 返回包含的组列表项的数量 return armTypes.length; } @Override public longgetGroupId(int groupPosition) { return groupPosition; } // 该方法决定每个组选项的外观 @Override public ViewgetGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // 返回的View对象将作为组列表项 LinearLayout ll = new LinearLayout(MainActivity.this); ll.setOrientation(0); ImageView logo = new ImageView(MainActivity.this); logo.setImageResource(logos[groupPosition]); ll.addView(logo); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); ll.addView(textView); return ll; } @Override public booleanisChildSelectable(int groupPosition, int childPosition) { return true; } @Override public booleanhasStableIds() { return true; } }; ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list); expandListView.setAdapter(adapter); }}
- Spinner的功能及用法
- AdapterViewFlipper的功能及用法
xml属性 | 说明 |
android:animateFirstView | 设置显示该组件的第一个view时是否使用动画 |
android:inAnimation | 设置组件显示时使用的动画 |
android:loopViews | 设置循环到最后一个组件后是否自动“转头”到第一个组件 |
android:outAnimation | 设置组件隐藏时使用的动画 |
xml属性 | 相关方法 | 说明 |
android:autoStart | startFlipping() | 设置显示该组件是否自动播放 |
android:flipInterval | setFlipInterval(int) | 设置自动播放的时间间隔 |
int[]imageIds = new int[] { R.drawable.shuangzi, R.drawable.shuangyu, R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie, R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping, R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu, R.drawable.mojie };
private AdapterViewFlipper flipper;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
flipper = (AdapterViewFlipper) findViewById(R.id.flipper);
// 创建一个BaseAdapter对象,该对象负责提供Gallery所显示的列表项 BaseAdapteradapter = new BaseAdapter() { @Override public int getCount() { return imageIds.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } // 该方法返回的View代表了每个列表项 @Override public ViewgetView(int position, View convertView, ViewGroup parent) { // 创建一个ImageView ImageView imageView = newImageView(MainActivity.this); imageView.setImageResource(imageIds[position]); // 设置ImageView的缩放类型 imageView.setScaleType(ImageView.ScaleType.FIT_XY); // 为imageView设置布局参数 imageView.setLayoutParams(new ViewGroup.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); return imageView; } }; flipper.setAdapter(adapter); } public voidprev(View source) { // 显示上一个组件 flipper.showPrevious(); // 停止自动播放 flipper.stopFlipping(); } public voidnext(View source) { // 显示下一个组件。 flipper.showNext(); // 停止自动播放 flipper.stopFlipping(); } public voidauto(View source) { // 开始自动播放 flipper.startFlipping(); }}
- StackView的功能及用法
另外cell布局里只是一个ImageView内容 代码 public class MainActivity extends Activity { StackView stackView; int[] imageIds = new int[] { R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7 , R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10 , R.drawable.bomb11 , R.drawable.bomb12 , R.drawable.bomb13 , R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16 }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
stackView = (StackView) findViewById(R.id.mStackView);
// 创建一个List对象,List对象的元素是Map List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageIds.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); listItem.put("image", imageIds[i]); listItems.add(listItem); }
// 创建一个SimpleAdapter SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems // 使用/layout/cell.xml文件作为界面布局 , R.layout.cell, new String[] { "image" }, new int[] { R.id.image1 }); stackView.setAdapter(simpleAdapter); } public void prev(View view) { // 显示上一个组件 stackView.showPrevious(); } public void next(View view) { // 显示下一个组件 stackView.showNext(); }}