本文来自http://blog.csdn.net/hellogv/
GridView跟ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选!本文就是介绍如何使用GridView实现九宫 图。GridView的用法很多,网上介绍最多的方法就是自己实现一个ImageAdapter继承BaseAdapter,再供GridView使用, 类似这种的方法本文不再重复,本文介绍的GridView用法跟前文ListView的极其类似。。。。也算是我偷懒一下,嘻嘻嘻嘻。。。。
先来贴出本文代码运行的结果:
本文需要添加/修改3个文件:main.xml、night_item.xml、JAVA源代码。
main.xml源代码如下,本身是个GirdView,用于装载Item:
- <?xml version="1.0" encoding="utf-8"?>
- <GridView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/gridview"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:numColumns="auto_fit"
- android:verticalSpacing="10dp"
- android:horizontalSpacing="10dp"
- android:columnWidth="90dp"
- android:stretchMode="columnWidth"
- android:gravity="center"
- />
介绍一下里面的某些属性:
android:numColumns="auto_fit" ,GridView的列数设置为自动
android:columnWidth="90dp",每列的宽度,也就是Item的宽度
android:stretchMode="columnWidth",缩放与列宽大小同步
android:verticalSpacing="10dp",两行之间的边距,如:行一(NO.0~NO.2)与行二(NO.3~NO.5)间距为10dp
android:horizontalSpacing="10dp",两列之间的边距。
接下来介绍 night_item.xml,这个XML跟前面ListView的ImageItem.xml很类似:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:paddingBottom="4dip" android:layout_width="fill_parent">
- <ImageView
- android:layout_height="wrap_content"
- android:id="@+id/ItemImage"
- android:layout_width="wrap_content"
- android:layout_centerHorizontal="true">
- </ImageView>
- <TextView
- android:layout_width="wrap_content"
- android:layout_below="@+id/ItemImage"
- android:layout_height="wrap_content"
- android:text="TextView01"
- android:layout_centerHorizontal="true"
- android:id="@+id/ItemText">
- </TextView>
- </RelativeLayout>
最后就是JAVA的源代码了,也跟前面的ListView的JAVA源代码很类似,不过多了“选中”的事件处理:
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- GridView gridview = (GridView) findViewById(R.id.gridview);
- //生成动态数组,并且转入数据
- ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();
- for(int i=0;i<10;i++)
- {
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("ItemImage", R.drawable.icon);//添加图像资源的ID
- map.put("ItemText", "NO."+String.valueOf(i));//按序号做ItemText
- lstImageItem.add(map);
- }
- //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
- SimpleAdapter saImageItems = new SimpleAdapter(this, //没什么解释
- lstImageItem,//数据来源
- R.layout.night_item,//night_item的XML实现
- //动态数组与ImageItem对应的子项
- new String[] {"ItemImage","ItemText"},
- //ImageItem的XML文件里面的一个ImageView,两个TextView ID
- new int[] {R.id.ItemImage,R.id.ItemText});
- //添加并且显示
- gridview.setAdapter(saImageItems);
- //添加消息处理
- gridview.setOnItemClickListener(new ItemClickListener());
- }
- //当AdapterView被单击(触摸屏或者键盘),则返回的Item单击事件
- class ItemClickListener implements OnItemClickListener
- {
- public void onItemClick(AdapterView<?> arg0,//The AdapterView where the click happened
- View arg1,//The view within the AdapterView that was clicked
- int arg2,//The position of the view in the adapter
- long arg3//The row id of the item that was clicked
- ) {
- //在本例中arg2=arg3
- HashMap<String, Object> item=(HashMap<String, Object>) arg0.getItemAtPosition(arg2);
- //显示所选Item的ItemText
- setTitle((String)item.get("ItemText"));
- }
- }
-
108楼
dai_lixing 2013-05-14 08:00发表 [回复]
-
-
你好,博主,请问下你在刚文章开头时说:“实现一个ImageAdapter继承BaseAdapter” 请问下为什么大家都继承BaseAdapter,这样做有什么好处呢,谢谢!
(刚开始学android,请指教,谢谢)
-
107楼
lansehaiyang007 2013-04-28 12:21发表 [回复]
-
- 好文章必须顶起
-
106楼
ccc905341846 2013-04-18 22:52发表 [回复]
-
- 感谢楼主,我发现你回复很多,我也在学习中
-
105楼
zxcvbnmluton 2013-04-11 15:52发表 [回复]
-
- 谢谢了。必须顶上去。学习了。
-
102楼
tangzhihai 2013-03-01 09:46发表 [回复]
-
- 不错不错
-
101楼
qdd0818 2013-01-18 16:14发表 [回复]
-
-
楼主,请教一个小问题:
我的gridView设置列为8列,通过setLayoutParams设置成1600,屏幕的宽度是720,然后在getView里面设置每个item的宽为200,结果,我看到的是每个item实际上没有200,还是把720平分后的大小。这是为什么呢。
-
100楼
yangguangtianshi1121 2012-12-25 17:01发表 [回复]
-
- 楼主你好,我用gridview实现,每项放入 一张图片和文字,图片在上,文字在下,怎么实现点击每项 ,每项是高亮啊。我如果只在每项放入图片,就可以获得高亮,但是加入文字,点击每项的时候就不显示高亮了。
-
97楼
hubeigaokao 2012-11-05 10:35发表 [回复]
-
-
- private int imageTitle[] = { R.string.communicate,
- R.string.located_resources, R.string.network, R.string.gps,
- R.string.tools, R.string.central_control };
- ArrayList<HashMap<String, Object>> listImageItem = new ArrayList<HashMap<String, Object>>();
- for (int i = 0; i < 6; i++) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("ItemImage", mThumbIds[i]);
- map.put("ItemTitle", imageTitle[i]);
- listImageItem.add(map);
- }
- SimpleAdapter ImageItems = new SimpleAdapter(this, listImageItem,R.layout.gridview_item,
- new String[] { "ItemImage", "ItemText" }, new int[] {
- R.id.ItemImage, R.id.ItemText });
- mGrid.setAdapter(ImageItems);
-
95楼
jzp12 2012-08-12 14:35发表 [回复]
-
- 请教,现在示例是columnWidth是90dp,即默认focus到某个item时的背景宽度也是90dp,如果我想实现focus到某个item时有个方框将此item包围在内部,即此方框的宽度要大于90dp,怎么实现?
-
94楼
SBzhanghuimin 2012-08-08 16:03发表 [回复]
-
- 我想请教一下ItemClickListener的回调函数中后两个参数是不是总是一致的?
-
93楼
tarofriend 2012-07-28 10:11发表 [回复]
-
- 顶!
-
92楼
WoShaVWu 2012-07-25 10:03发表 [回复]
-
-
楼主给的源代码里 图片都是用的同一张图片
但我想显示出不同的图片 能通过数组解决吗 怎么改啊 谢谢~
并且附的文字信息如果没有规律的话用数组能解决吗
-
91楼
gycxgycx 2012-07-17 12:56发表 [回复]
-
- 楼主你好,我看了你几篇gridview的帖子,另外一篇从数据库读数据的只把gridview作为分页用,我想知道怎么把数据库的数据读到gridview里显示,而不是显示在textview里……
-
90楼
android_0999 2012-07-16 10:01发表 [回复]
-
-
顶是必须的!
只不过还有问题想请教楼主,我想在gridview中加一个动画效果,加到每一个选中的位置上,但是不知道怎么引用hashmap中的数据....望指教~
-
89楼
zhangke19891001 2012-07-14 11:30发表 [回复]
-
- 此贴不顶,天理难容
-
88楼
guolong2008 2012-07-04 15:44发表 [回复]
-
- 楼主很牛啊
-
85楼
penglijiang 2012-06-11 17:10发表 [回复]
-
- 学习了 谢谢 很详细
-
84楼
gouyingqi 2012-06-05 17:26发表 [回复]
-
-
楼主你好,我照着你的代码做了一个GridView,但是我的图片需要从服务器获得,修改了一下FoR那一段的代码,如下,其中图片的URL已获得,存在ImageURL[]中
- for(int i=0;imageURL[i]!=null;i++)
- {
- //添加书籍图像
- InputStream is = null;
- try {
- System.out.println(imageURL[i]);
- URL url = new URL(HttpUtil.BASE_URL+imageURL[i]);
- URLConnection conn = url.openConnection();
- conn.setDoInput(true);
- conn.connect();
- is = conn.getInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- }
- Bitmap bm=BitmapFactory.decodeStream(is);
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("ItemImage", bm);//添加图像资源的ID
- map.put("ItemText", bookName[i]);//按序号做ItemText
- lstImageItem.add(map);
- }
图片无法显示,logcat输出resolveUri failed on bad bitmap uri: android.graphics.drawable.BitmapDrawable@44f3c268
请教如何实现,谢谢
-
Re:
gouyingqi 2012-06-12 22:24发表 [回复]
-
- 回复嗯,在其他地方看到重写Adapter类,搞定了。话说Stack OverFlow这个网站貌似很NB,老是搜到这个站的内容,就是英文看得太痛苦:
-
83楼
qianjin0703 2012-05-28 13:43发表 [回复]
-
- 楼主,如果我点击一个ImageView的时候改变图片该怎么做呢
-
82楼
wendaopeng11 2012-05-24 19:59发表 [回复]
-
- 楼主楼主,我要达到单击之后跳转到别的activity应该怎么做呢
-
Re:
qianjin0703 2012-05-28 13:42发表 [回复]
-
- 回复wendaopeng11: 在onItemClick()里做就可以了。
-
80楼
wu110cheng 2012-05-04 21:16发表 [回复]
-
- 必写的好.必须支持,,
-
79楼
Mary881225 2012-03-11 16:27发表 [回复]
-
- 图附不上去,不好意思了。
-
78楼
Mary881225 2012-03-11 16:25发表 [回复]
-
-
楼主好!初学者向你请教个问题。我想做一个MP3音乐播放器:
运行后:
1、一个界面的上方是MP3文件的列表(区域固定,显示多列,有单击事件)
如图所示:
2、下方是一个嵌套很多控件的视图。
如图所示:
想问的是:这个带ListView的整体框架怎么实现?多列怎么实现?能给其中的一列设置监听器吗?怎么设置?
-
77楼
Mary881225 2012-03-11 16:07发表 [回复]
-
- 赞!继续看下去!
-
76楼
wl455624651 2012-02-08 10:30发表 [回复]
-
- 楼主我有个难题,不知道你能帮我解决不?你能做出像美丽说一样的图片错位题效果吗?你下载一个android版本的美丽说应用,然后进入热门,他的图片有错位体效果。请教如何实现?
-
74楼
chenhx666666 2011-11-30 00:14发表 [回复]
-
-
请教hellogv大牛,我的GridView中是N幅jpg图片,想得到的效果是每次点击一个图片,满足一定的条件之后它会消失。为此使用了setOnItemClickListener,但是怎么来重画这个GridView呢?
非常感谢~~
-
73楼
dengforeverred 2011-11-07 19:21发表 [回复]
-
- 楼主能不能修改上面的代码和添加相关图标资源,实现不同的图标像上面的方式排列呢?
-
72楼
pengmengjiao 2011-11-04 09:57发表 [回复]
-
- 嘻嘻 看了 不错哦!
-
70楼
a270724695 2011-09-06 10:25发表 [回复]
-
- 请教下 九宫图 怎么让GridView里面的控件自动适应(填充)屏幕大小
-
68楼
Natepan 2011-08-16 21:08发表 [回复]
-
- 请问博主,gridview.setAdapter(saImageItems);处出现 空指针异常主要是什么原因啊?我看见上面几个朋友也是呀。
-
Re:
hellogv 2011-08-16 12:19发表 [回复]
-
-
回复agods:把Item的spacing设为0,
gridView.setColumnWidth(itemWidth);
gridView.setNumColumns(GridView.AUTO_FIT);
-
64楼
Jack_Yang4 2011-08-09 21:04发表 [回复]
-
- 为什么我get到的GridView是null呢?求解释。
-
63楼
Jack_Yang4 2011-08-09 20:39发表 [回复]
-
- 要定义一下GridView gridview=null;不然就报错,还有 gridview.setAdapter(saImageItems);这里出现空指针错误。
-
61楼
aa6109569773 2011-07-14 17:04发表 [回复]
-
- 太实用了
-
60楼
aa6109569773 2011-07-14 17:03发表 [回复]
-
- 你真好
-
57楼
q453919025 2011-06-14 23:26发表 [回复]
-
- 哈哈 真的挺不错 [e01]
-
56楼
take2008518 2011-05-27 11:27发表 [回复]
-
- 如果要对GridView菜单的每个Item为图片和文字,然后点击的时候换成彩色的图片,当点击另外一个Item时又恢复原来的默认图片,请问一下该如何做呢?
-
55楼
meng_qing_shan 2011-05-18 17:26发表 [回复]
-
- 很好很实用啊
-
54楼
ainiyidiandian 2011-05-14 17:19发表 [回复]
-
- 我发现一个问题,就是一行有几个item有的名字是2行,有的是1行,在焦点从此行切换到其他行的时候名字有一行的items会位置变动
-
53楼
liuzhidong123 2011-05-13 10:12发表 [回复]
-
- 好啊[e01]
-
52楼
chen3273099 2011-04-28 13:20发表 [回复]
-
- [e03][e02][e03]
-
51楼
chen3273099 2011-04-28 13:19发表 [回复]
-
- [e03]
-
50楼
shaipxiang 2011-04-26 09:32发表 [回复]
-
- [e01]很好@!!!!!!!!
-
48楼
ilovetiandi 2011-04-17 18:02发表 [回复]
-
- 谢谢博主的实例,先把代码贴过去试试再说。
-
45楼
liuting3358 2011-03-22 16:41发表 [回复]
-
- 麻烦 import 的包也发一下把[e01]
-
44楼
bujixiansheng 2011-03-10 21:34发表 [回复]
-
- [e01]
-
43楼
hellneighbor 2011-03-10 16:04发表 [回复]
-
- 我在TabHost里面用到这个,然后设置background=“#FFFFFF”,然后,只有这个是白的,中间的间隔无论怎么设置都是灰色的,请问真么将最底层的背景色也给设置成白色的?
-
38楼
hugengzong 2010-12-16 17:47发表 [回复]
-
- [e03]
-
37楼
yzhang2000 2010-12-14 15:55发表 [回复]
-
- 很好!比用BaseAdapter继承一个类来自己实现强太多,其实ListView也可以照此来做,很好用的,还可以自己扩展很多功能。
-
34楼
xiaocai607 2010-12-05 16:36发表 [回复]
-
- 这个如果是从sdk上读取图片怎么办啊?楼主可否知道
-
33楼
jordan3321 2010-12-02 15:28发表 [回复]
-
- 朋友。你能实现一个dialog加spinner么.可以加qq讨论么。121393221.十分感谢
-
32楼
SnowGeneral 2010-11-25 08:57发表 [回复]
-
- 标签属性的android:layout_centerHorizontal在api中没有见到,请教是从哪里看到的,我从父类中也看了,没有找到,具体的作用有是什么呢?
-
30楼
fly_binbin 2010-11-17 13:14发表 [回复]
-
- 控件已经添加,因此才郁闷不知道是什么原因!
-
29楼
fly_binbin 2010-11-17 09:59发表 [回复]
-
- 前 几个例子都不错,运行也正常,为什么这个例子的到了这句 GridView gridview = (GridView) findViewById(R.id.gridview)就报错啊Cannot cast from View to GridView main.xml和night_item.xml都没错啊 为什么啊我的怎么都转换不过去呢?
-
28楼
yahier 2010-11-16 17:07发表 [回复]
-
- 适 配器的最后的两个 new String[] {"ItemImage","ItemText"}, new int[] {R.id.ItemImage,R.id.ItemText}); int数组里面的ItemImage怎么显示出来的的呢 哪个代码做的呢[e04] [e07][e07]
-
26楼
yahier 2010-11-15 22:20发表 [回复]
-
- 源代码中有GridView gridview = (GridView) findViewById(R.id.gridview); 但是布局文件中 没有啊[e07]
-
Re:
MoroseFingerling 2010-11-03 14:38发表 [回复]
-
- 回复 yiranhan:你可以事先定义一个数组 专门存放不同的图片 然后再循环装入动态数组中,或者你就别用循环,一个个add 放不同的图片。。。。。
-
22楼
shumei080228 2010-10-11 20:41发表 [回复]
-
- [e01]
-
21楼
shumei080228 2010-10-11 20:41发表 [回复]
-
- 大爱楼主,谢谢啦
-
20楼
qigaosheng 2010-08-27 15:35发表 [回复]
-
-
前几个例子都不错,运行也正常,为什么这个例子的到了这句
GridView gridview = (GridView) findViewById(R.id.gridview)就报错啊Cannot cast from View to GridView
main.xml和night_item.xml都没错啊 为什么啊[e08]
-
13楼
snakeninny 2010-03-23 20:57发表 [回复]
-
-
[e01][e01][e01]
请教一下,第25行的这个参数arg1有什么作用?能举个例子吗?多谢!
另:我的SDK上怎么找不到这个34行函数onItemClick()的解释啊?
-
9楼
匿名用户 2010-02-27 18:28发表 [回复]
-
-
[e01]
太谢谢,兄弟已经憋在这里好几天了。就是不知道那个该死的GirdView怎么能把图像和文字捏到一起。谢谢了!!!!
[e06]
-
8楼
bq315505460 2010-02-05 22:09发表 [回复]
-
- 又不知道哪里错了
-
Re:
bq315505460 2010-02-05 22:53发表 [回复]
-
-
回复 hellogv:[e03]
问题解决[e04]
-
7楼
bq315505460 2010-02-05 22:09发表 [回复]
-
- 我做了一个单击有问题
-
3楼
redsky200905 2010-01-11 14:42发表 [回复]
-
- [e01]
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场