本文来自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()的解释啊?
- 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网站的观点或立场