1.网格视图(GridView)
GridView用于在界面上按行、列分布的方式来显示多个组件。
GridView和ListView有共同的父类:AbsListView,所以它们有很高的相似性。ListView相当于一种特殊的GridView。
GridView也需要Adapter来提供显示的数据。
实例:带预览的图片浏览器
界面布局文件代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<!-- 定义一个GridView组件 -->
<GridView
android:id="@+id/grid1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:horizontalSpacing="1pt"
android:verticalSpacing="1pt"
android:numColumns="4"
android:gravity="center"
></GridView>
<!-- 定义一个ImageView组件 -->
<ImageView
android:id="@+id/image1"
android:layout_width="240dp"
android:layout_height="240dp"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>
PS:以上代码简单定义了一个GridView、一个ImageView。属性android:numColumns=“4”,
意味着网格包含4列,行数由Adapter决定。
Activity代码清单:
public class GridViewT extends Activity {
GridView grid1;
ImageView image1;
int[] imageIds = new int[]
{
R.drawable.p00, R.drawable.p01, R.drawable.p02,
R.drawable.p03, R.drawable.p04, R.drawable.p05,
R.drawable.p06, R.drawable.p07, R.drawable.p08,
R.drawable.p09, R.drawable.p10, R.drawable.p11
};
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.grid_view_t);
//创建一个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
image1 = (ImageView) findViewById(R.id.image1);
image1.setImageResource(imageIds[0]);
//创建SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this,
listItems,
//使用cell.xml文件作为界面布局
R.layout.cell, new String[] {"image"},
new int[]{R.id.image});
grid1 = (GridView) findViewById(R.id.grid1);
grid1.setAdapter(simpleAdapter);
//添加列表项被选中的监听器
grid1.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 显示当前被选中的图片
image1.setImageResource(imageIds[position + 1]);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
//添加列表项被单击的监听器
grid1.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//显示被单击的图片
image1.setImageResource(imageIds[position]);
}
});
}
}
Ps:在layout目录下定义一个cell.xml界面布局,包含一个简单ImageView组件。
显示效果:
2.可展开的列表组件(ExpandableListView)
ExpandableListView是ListView的子类,它把应用中的列表项分成几组,每组里又可包含多个列表项。列表项由ExpandableListAdapter提供。
实例:
界面布局文件:在LinearLayout内定义一个ExpandableListView
Activity代码清单:
public class ExpandableLiestViewT extends Activity {
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.expandable_liest_view_t);
//创建一个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 groundPosition, int childPosition)
{
return arms[groundPosition][childPosition];
}
@Override
public long getChildId(int groupPosion, int childPosion)
{
return childPosion;
}
@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(ExpandableLiestViewT.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, ViewGroupparent) {
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, ViewGroupparent) {
LinearLayout ll = new LinearLayout(ExpandableLiestViewT.this);
ll.setOrientation(0);
ImageView logo = new ImageView(ExpandableLiestViewT.this);
logo.setImageResource(logos[groupPosition]);
ll.addView(logo);
TextView textView =getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int groupPosition,
int childPosition) {
return true;
}
};
ExpandableListView expandableListView =(ExpandableListView) findViewById
(R.id.list);
expandableListView.setAdapter(adapter);
}
}
PS:上面代码通过扩展BaseExpandableListAdapter来实现ExpandableListAdapter, 扩展BaseExpandableListAdapter时关键有如下四个方法:
l getGroupCount():该方法返回包含的组列表项的数量
l getGroupView():该方法返回的View对象将作为组列表项
l getChildrenCount():该方法返回特定组所包含的子列表项的数量
l getChildView():该方法返回的View对象将作为特定组、特定位置的子列表项
由于在界面布局文件的ExpandableListView中添加了android:childIndicator="@drawable/ic_launcher", 所以在子列表项左边会有图标。
显示效果: