- 列表视图(ListView)和ListActivity
①直接使用ListView创建
②让Activity继承ListActivity(相当于该activity显示的组件为ListView)
提示: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集合
③//将数组包装为ArrayAdapter
ArrayAdapter<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
BaseAdapter adapter = new BaseAdapter() {
@Override
public int getCount() {
// 返回值控制该Adapter将会包含多少个列表项
// 指定一共包含40个选项
return 40;
}
@Override
public Object getItem(int position) {
// 返回值决定第position处的列表项的内容
return null;
}
@Override
public long getItemId(int position) {
// 返回值将作为列表项的ID
return position;
}
@Override
public View 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)的功能及用法
从EditText派生而出,实际上它也是一个文本编辑框。当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户选择,然后自动填写该文本框。
其还派生出一个子类:MultiAutoCompleteTextView(允许输入多个提示项)
main.xml
<!-- 定义一个自动完成文本框,
指定输入一个字符后进行提示 -->
<
AutoCompleteTextView
android:id="@+id/auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:
completionHint="请选择您喜欢的图书:" <!--设置下拉菜单中的提示标题-->
android:
dropDownHorizontalOffset="10dp" <!--下拉菜单与文本框之间的水平偏移-->
android:
completionThreshold="1"/> <!--设置用户至少输入几个字符才会显示提示-->
<!-- 定义一个MultiAutoCompleteTextView组件 -->
<
MultiAutoCompleteTextView
android:id="@+id/mauto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1"/>
MainActivity.java
public class MainActivity extends Activity {
AutoCompleteTextView actv;
MultiAutoCompleteTextView mauto;
// 定义字符串数组,作为提示的文本
String[] books = new String[]{
"疯狂Java讲义",
"疯狂Ajax讲义",
"疯狂XML讲义",
"疯狂Workflow讲义"
};
@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)
|
android:stretchMode支持如下属性值
NO_STRETCH不拉伸
STRETCH_SPACING仅拉伸元素之间的间距
STRETCH_SPACING_UNIFORM表格元素本身、元素之间的间距一起拉伸
STRETCH_COLUMN_WIDTH仅拉伸表格元素本身
main.xml
<!-- 定义一个GridView组件 -->
<
GridView
android:id="@+id/grid01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:horizontalSpacing="1pt"
android:verticalSpacing="1pt"
android:numColumns="4"
android:gravity="center"/>
<!-- 定义一个ImageView组件 -->
<
ImageView android:id="@+id/imageView"
android:layout_width="240dp"
android:layout_height="240dp"
android:layout_gravity="center_horizontal"/>
MainActivity.java
public class MainActivity extends Activity {
GridView grid;
ImageView imageView;
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)
把应用中的列表项分为几组,每组里又可包含多个列表项。列表项由ExpandableListAdapter提供。
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 Object getChild(int groupPosition, int childPosition) {
// 获取指定组位置、指定子列表项处的子列表项数据
return arms[groupPosition][childPosition];
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public int getChildrenCount(int groupPosition) {
// 特定组所包含的子列表项的数量
return arms[groupPosition].length;
}
private TextView getTextView() {
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 View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// 该方法决定每个子选项的外观
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition)
.toString());
return textView;
}
@Override
public Object getGroup(int groupPosition) {
// 获取指定组位置处的组数据
return armTypes[groupPosition];
}
@Override
public int getGroupCount() {
// 返回包含的组列表项的数量
return armTypes.length;
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
// 该方法决定每个组选项的外观
@Override
public View getGroupView(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 boolean isChildSelectable(int groupPosition,
int childPosition) {
return true;
}
@Override
public boolean hasStableIds() {
return true;
}
};
ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list);
expandListView.setAdapter(adapter);
}
}
- Spinner的功能及用法
列表选择框(相当于弹出一个菜单供用户选择)
// 建立Adapter并且绑定数据源、mItems数组资源
ArrayAdapter<String> _Adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);
//绑定 Adapter到控件
mSpinner.setAdapter(_Adapter);
//Spinner在布局文件中声明
- AdapterViewFlipper的功能及用法
会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。
在切换过程中可以使用渐隐渐显的动画效果。还可以调用startFlipping()控制它“自动播放”下一个View组件。
AdapterViewAnimator支持的属性:
xml属性 | 说明 |
android:animateFirstView | 设置显示该组件的第一个view时是否使用动画 |
android:inAnimation | 设置组件显示时使用的动画 |
android:loopViews | 设置循环到最后一个组件后是否自动“转头”到第一个组件 |
android:outAnimation | 设置组件隐藏时使用的动画 |
AdapterViewFlipper支持的xml属性及相关方法:
xml属性 | 相关方法 | 说明 |
android:autoStart | startFlipping() | 设置显示该组件是否自动播放 |
android:flipInterval | setFlipInterval(int) | 设置自动播放的时间间隔 |
自动播放图片
布局:
<
AdapterViewFlipper
android:id="@+id/flipper"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:flipInterval="5000"
android:layout_alignParentTop="true"/>
<Button
...
android:onClick="prev"
android:text="上一个"/>
<Button
...
android:onClick="next"
android:text="下一个"/>
<Button
...
android:onClick="auto"
android:text="自动播放"/>
代码:
public class MainActivity extends Activity {
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所显示的列表项
BaseAdapter adapter = 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 View getView(int position, View convertView, ViewGroup parent) {
// 创建一个ImageView
ImageView imageView = new ImageView(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 void prev(View source) {
// 显示上一个组件
flipper.showPrevious();
// 停止自动播放
flipper.stopFlipping();
}
public void next(View source) {
// 显示下一个组件。
flipper.showNext();
// 停止自动播放
flipper.stopFlipping();
}
public void auto(View source) {
// 开始自动播放
flipper.startFlipping();
}
}
- StackView的功能及用法
以“堆叠”的方式来显示多个列表项,为了控制StackView显示的view组件,StackView提供了如下两种控制方式:
①拖走StackView中处于顶端的View,下一个View将会显示出来。将上一个View拖进StackView,将使之显示出来
②通过调用StackView的showNext()、showPrevious()控制显示下一个、上一个组件
叠在一起的图片
布局main.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<
StackView
android:
id="@+id/mStackView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:loopViews="true" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一个"
android:onClick="prev"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一个"
android:onClick="next"/>
</LinearLayout>
</LinearLayout>
另外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();
}
}