AdapterVIew本身是一个抽象基类,它派生的子类用法十分相似。
Adapter特征:
AdapterView继承了ViewGroup,它本质是容器Adapter可以包括多个“列表项”,并将多个“列表项”以合适的形式显示出来AdapterView显示多个“列表项”由Adapter提供,调用AdapterView的setAdapter(adapter)方法设置即可。
GridView网格视图
之前有说过ListView和Adapter,本次要说的是GridView,它和ListView基本相同,区别在于ListView只显示一列,而GridView可以显示多列,当GridView只显示一列的话,那么它相当于ListView。关系图解
GridView常用属性
android:columnWidth 设置列的宽度
android:gravity 设置对齐方式
android:horizontalSpacing 设置各元素之间的水平间距
android:verticalSpacing 设置各元素之间的垂直间距
android:numColumns 设置列数 默认是1
android:stretchMode 设置拉伸模式
GridView的Demo:
MainActivity.java
public class MainActivity extends Activity {
GridView gview;
ImageView img;
//给适配器设置9张系统内置的图片
int[] imgs = new int[] {
android.R.drawable.ic_btn_speak_now,
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_alert,
android.R.drawable.ic_dialog_dialer,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_lock_idle_alarm,
android.R.drawable.ic_input_add,
android.R.drawable.ic_media_ff,
android.R.drawable.ic_menu_call };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView) findViewById(R.id.img);
List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();
//通过循环把9张图片添加List集合中
for (int i = 0; i < imgs.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", imgs[i]);
listitems.add(map);
}
//参数3 展示的布局文件
//参数4 把参数2集合中的Key值拿出来
//参数5 把拿出来的key值放在该空间上展示
SimpleAdapter adapter = new SimpleAdapter(this, listitems, R.layout.cell, new String[]{"image"}, new int[]{R.id.image1});
gview=(GridView) findViewById(R.id.gv);
gview.setAdapter(adapter);
//给GridView添加点击监听
gview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//显示被点击的图片
img.setImageResource(imgs[position]);
System.out.println("被点击了~~~~~~~~~~~");
}
});
//给GridView选中监听
gview.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
//显示被选中的图片
img.setImageResource(imgs[position]);
System.out.println("被选中了");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal" >
<GridView android:id="@+id/gv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="3"
android:gravity="center"
android:horizontalSpacing="1pt"
android:verticalSpacing="1pt"/>
<ImageView
android:id="@+id/img"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
cell.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:padding="2pt"
>
<ImageView
android:id="@+id/image1"
android:layout_width="50dp"
android:layout_height="50dp"
/>
</LinearLayout>
效果图:
ExpandableListView可展开的列表组件
ExpandableListView是ListView的子类,它进行的扩展是把列表项分为几组,每个组里又包含多个列表项,在用法上与ListView非常相似,ExpandableListView的列表项由ExpandableListAdapter提供,ExpandableListAdapter也是一个接口,下面是该接口的继承关系图:
上图可以看出,虽然后缀是Adapter但是他的关系只是继承Object而已,但是与Adapter类似,它有三种常用方式
1.扩展BaseExpandableListAdapter实现ExpandableListAdapte
2.使用SimpleExpandableListAdapter将两个List集合
3.使用SimpleCursorTreeAdapter将Cursor中的数据包装成SimpleCursorTreeAdapter
额外支持的XML属性
android:childDivider 指定各组内各子列表项之间的分隔条
android:childIndicator 显示在子列表旁边的Drawalbe对象
android:groupIndicator 显示在组列表项旁边的Drawable对象
组元素表示可折叠的列表项,子元素表示列表项展开后看到的多个子元素项
简单模拟QQ分组样式
MainActivity.java
public class MainActivity extends Activity {
private ExpandableListView expan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expan=(ExpandableListView) findViewById(R.id.expan);
expan.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseExpandableListAdapter {
private String[] armType = new String[] { "德玛西亚", "诺克萨斯", "弗雷尔卓德" };
private String[][] arms = new String[][]
{
{ "盖伦", "奎因", "嘉文四世" },
{ "德莱厄斯", "卡特琳娜", "德莱文", "泰隆" },
{ "艾希", "努努", "艾尼维亚", "林桑桌", "布隆" }
};
@Override
public int getGroupCount() {
return armType.length;
}
//获取某个分组的孩子们的个数
@Override
public int getChildrenCount(int groupPosition) {
return arms[groupPosition].length;
}
//获得这个组的元素
@Override
public Object getGroup(int groupPosition) {
return armType[groupPosition];
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return arms[groupPosition][childPosition];
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
//每个组的外观怎么显示
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
LinearLayout ll = new LinearLayout(MainActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
//子列表的外观
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition).toString());
textView.setPadding(100, 0, 0, 0);
return textView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return false;
}
private TextView getTextView(){
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,64);
TextView textView = new TextView(MainActivity.this);
textView.setLayoutParams(lp);
textView.setPadding(80, 0, 0, 0);
return textView;
}
}
}
activity_main.xml只是定义了ExpandableListView而已,这里就不给出了。
虽然方法比较多,但最重要的是这个4个:
getGroupCount();返回组列表的个数
getGroupView();返回组视图
getChildrenCount();返回子列表的个数
getChildView();返回子视图
效果图:
Spinner下拉列表组件
常用XML属性
android:entries 使用XML数组的形式设置下拉列表显示的项目
android:dropDownHorizontalOffset 设置下拉列表的水平偏移量
android:dropDownVerticalOffset 设置下拉列表的垂直偏移量
android:dropDownWidth 设置下拉列表框的宽度
android:popupBackground 设置下拉列表的背景色
android:prompt 设置该列表选择框的提示信息
默认选择第一个元素,它有设置值的方式,一种是XML文件数组形式,另一种是adapter。
Mainactivity.java
public class MainActivity extends Activity {
private Spinner s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
s=(Spinner) findViewById(R.id.s);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, new String[]{"德玛西亚","剑圣偷塔","盲僧抓瞎"});
s.setAdapter(adapter);
}
}
activity_main.java
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/lol" />
<Spinner
android:id="@+id/s"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
lol.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="lol">
<item>提莫</item>
<item>艾希</item>
<item>蛮</item>
<item>易</item>
<item>信</item>
</string-array>
</resources>
gallery画廊视图
在API8以上已经过时,原因过度耗费系统资源,推荐使用HorizontalScrollView或者ViewPager,同样HorizontalScrollView图片较多也会OOM,并且只能有一个唯一的子控件,VIewPager滑动的时候会删除没有显示的图片释放资源,并且预加载可能要用到的图片。
下面是HorizontalScrollView的事例:
Mainactivity.java
public class MainActivity extends Activity {
HorizontalScrollView hsv;
LinearLayout ll;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
hsv = (HorizontalScrollView) findViewById(R.id.hsv);
ll = (LinearLayout) findViewById(R.id.ll);
int imgs[] = new int[] {
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_alert,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_dialog_info,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_alert,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_dialog_info,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_alert,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_dialog_info,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_alert,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_dialog_info,
android.R.drawable.ic_dialog_map
};
for (int i = 0; i < imgs.length; i++) {
// 创建ImageView 并设置宽高
ImageView img = new ImageView(this);
// 设置显示的图片
img.setBackgroundResource(imgs[i]);
ll.addView(img);
}
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<HorizontalScrollView
android:id="@+id/hsv"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:orientation="horizontal"
android:id="@+id/ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
效果图:
AdapterViewFlipper
AdapterViewFlipper继承了AdapterViewAnimator,它在AdapterView的基础上新增了滑动时的动画。它也会显示Adapter提供多个View组件,但它每次只能显示一个View组件,程序中可通过showPrevious()和showNext()方法控制该组件现实上一个,下一个组件。AdapterViewFlipper可以在多个View切换过程中自动使用渐隐渐现的动画效果,除此之外,还可以调用该组件的startFlipping控制自动播放下一个View组件。
MainActivity.java
public class MainActivity extends Activity {
AdapterViewFlipper avf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
avf = (AdapterViewFlipper) findViewById(R.id.avf);
final int image[] = new int[] {
android.R.drawable.alert_dark_frame,
android.R.drawable.arrow_down_float,
android.R.drawable.bottom_bar, android.R.drawable.btn_default,
android.R.drawable.btn_dialog
};
BaseAdapter adapter = new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建ImageView
ImageView img = new ImageView(MainActivity.this);
img.setImageResource(image[position]);
//设置ImageView缩放类型
img.setScaleType(ImageView.ScaleType.FIT_XY);
//设置ImageView布局参数
img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return img;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return image[position];
}
@Override
public int getCount() {
return image.length;
}
};
avf.setAdapter(adapter);
}
public void prev(View view){
//设置上一个组件
avf.showPrevious();
}
public void next(View view){
//设置下一个组件
avf.showNext();
}
public void auto(View view){
//自动播放
avf.startFlipping();
}
}
activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<AdapterViewFlipper
android:id="@+id/avf"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:flipInterval="3000" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:onClick="prev"
android:text="上一个" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="next"
android:text="下一个" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:onClick="auto"
android:text="自动播放" />
</RelativeLayout>
效果图:
StackView堆叠
StackView是AdapterViewAnimator的子类,StackView将会以堆叠方式来显示多个列表项,当拖走StackView中处于顶端的View,下一个View就是显示出来,将上一个View拖进StackView,将使之显示出来。
MainActivity.java
public class MainActivity extends Activity {
StackView stack;
Button b1, b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
stack = (StackView) findViewById(R.id.stack);
b1 = (Button) findViewById(R.id.prov);
b2 = (Button) findViewById(R.id.next);
int img[] = new int[] {
android.R.drawable.bottom_bar,
android.R.drawable.btn_default_small,
android.R.drawable.btn_radio,
android.R.drawable.toast_frame,
android.R.drawable.sym_contact_card,
android.R.drawable.stat_sys_speakerphone
};
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
for(int i=0;i<img.length;i++){
Map<String,Object> map = new HashMap<String, Object>();
map.put("image", img[i]);
list.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.cell, new String[]{"image"}, new int[]{R.id.image1});
stack.setAdapter(adapter);
}
public void prov(View view){
stack.showPrevious();
}
public void next(View view){
stack.showNext();
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<StackView
android:id="@+id/stack"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00FF00"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="300dp">
<Button
android:id="@+id/prov"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="prov"
android:text="上一个" />
<Button
android:id="@+id/next"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="next"
android:text="下一个" />
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:padding="2pt"
>
<ImageView
android:id="@+id/image1"
android:layout_width="50dp"
android:layout_height="50dp"
/>
</LinearLayout>
效果图:
AdapterView开头的都需要有适配器才能显示的视图,如果还有后缀是该控件的功能扩展。