0%

Android GridView

网格视图

就是一个控件,在这个控件中类似于列表框控件,可以添加一个个小的视图,其实用起来就和一个格子一个格子的列表控件一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android_study10.MainActivity" >

<GridView
android:id="@+id/gridview"
android:numColumns="3"
android:layout_width="match_parent"
android:layout_height="match_parent"
></GridView>

</RelativeLayout>

布局比较简单,numColumns这个属性就是设置一行有几个格子。
布局完这个之后就来布局每个项目的布局。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >

<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
/>

<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Wker"
/>
</LinearLayout>

这个就是一个上面图片,下面文字的一个布局,用来存储每个项目。
接下来我们来编写代码。

首先我们先来定义控件和一个图片资源数组:

1
2
3
private ListAdapter ad;
private GridView Gv1;
private int[] images = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};

为了简单起见,我就放了几个自带的图片。

1
2
3
Gv1 = (GridView) findViewById(R.id.gridview);
ad = getAdapter();
Gv1.setAdapter(ad);

然后我们初始化控件,再设置一个适配器。
适配器获取的代码:

1
2
3
4
5
6
7
8
9
10
11
private ListAdapter getAdapter() {
List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
for (int i = 0; i < images.length; i++) {
HashMap<String,Object> hm = new HashMap<String,Object>();
hm.put("txt", "Wker"+i);
hm.put("img", images[i]);
list.add(hm);
}
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item, new String[] {"txt","img"}, new int[] {R.id.textview,R.id.imageView});
return adapter;
}

首先先定义一个HashMap的列表,一个文字对应一个组件数据。
然后我们用for循环逐渐添加,最后我们初始化这个SimpleAdapter,比较重要的就是最后两个控件,是一一对应的,我之前也说过,那个R.layout.item就是我们的项目布局。

1
2
3
4
5
6
7
Gv1.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, (CharSequence) ((HashMap<String,Object>)((SimpleAdapter)ad).getItem(position)).get("txt"), Toast.LENGTH_SHORT).show();;
}
});

添加个事件,注意的是,我们的适配器的某个项目使我们集合中的某个元素,这样我们就能够实现了,而且ListAdapter是SimpleAdapter的父类。
实现效果