AndroidDev 板


LINE

前一阵子在研究怎麽自订ListView 现在分享给大家 想像一下 一个ListView可能长这样 █████████ █ █ █ █ █ █ █████████ █ █ █ █ █ █ █████████ █ █ █ █ █ █ █████████ █ █ █ █ █ █ █ 然後如果用内建的ListView SampleAdapter顶多让你变成这样 █████████ █title █ █ □ █ █text █ █████████ █title █ █ □ █ █text █ █████████ █title █ █ □ █ █text █ █████████ █ █ █ █ █ █ █ 那如果我们想塞图、塞Button或者塞你想放进去的东西怎麽办? 很简单 利用BaseAdapter就可以轻松办到 首先我们了解一下什麽是BaseAdapter BaseAdapter是一个超好用的类别 它可以让你自己定义许多种View 例如 Spinner,ListView,GridView 那我们要怎麽去定义一个属於自己的ListView呢? 首先我们开启一个新的Project叫做MyListView 让MyListView去继承ListActivity(注意!不是Activity喔) 增加一个新的类别叫做MyAdapter, 并且继承BaseAdapter 你会发现需要覆写四个方法,分别是 int getCount() Object getItem(int position) long getItemId(int position) View getView(int position, View view, ViewGroup parent) 如果你是用eclipse应该会自动产生这四个方法 这四个方法我来稍微解释一下 我们知道ListView是由一列一列所组成的 而每一个列 我们可以将它看成是一个View 所组合起来的就是一整个ListView 所以getCount()就是可以取得到底有多少列的方法 而如果我们要取得某一列的内容 就是使用getItem()这个方法 如果你想要取得某一列的id就使用getItemId()这个方法 接着是我们最重要的一个方法 要做修改某一列View的内容 就是利用getView()这个方法 首先先想好要将ListView改变成怎样? 假设我们想要先塞一个Button 然後塞一张图片 最後在加上文字说明好了 可能就会长的像这样子 █████████ █╒╕┌—┐ █ █╘╛|☆∣text█ █ └—┘ █ █████████ █╒╕┌—┐ █ █╘╛|☆∣text█ █ └—┘ █ █████████ █╒╕┌—┐ █ █╘╛|☆∣text█ █ └—┘ █ █████████ █ █ █ █ █ █ █ 那麽我们就开始吧! 首先在建立一个list.xml里面加上一个<ListView ...></ListView> 这是我们点进去第一个看到的画面 再来就是增加一个adapter.xml 里面就是放每一列ListView的内容 根据我们想要的会放下 由於我的Layout设定为RelativeLayout 因此会多一个关联的属性 <Button android:id="@+id/AdapterButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5px"> <!-- 位置要调整好 放在左边--> </Button> <ImageView android:id="@+id/AdapterImage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/AdapterButton"<!-- 设定在Button的右边 --> android:layout_marginLeft="25px"> </ImageView> <TextView android:id="@+id/AdapterText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/AdapterImage" <!-- 设定在ImageView的右边 --> android:layout_marginLeft="45px"> </TextView> 接着我们在MyListView里面指定main.xml为一开始的画面 setContentView(R.layout.list); 然後设定MyAdapter为ListView的Adapter setListAdapter(new MyAdapter(this)); 接着换到MyAdapter.java 我们一开始就会定义几个变数 private LayoutInflater adapterLayoutInflater; 然後在建构子里面宣告读取MyListView的Context adapterLayoutInflater = LayoutInflater.from(c); 因为是范例 所以我们就简单的用三列好了 因此我们将return设定为3 public int getCount() { // TODO Auto-generated method stub return 3; } 再来就是要取得view的顺序 先是Button 再来是ImageView 接着是 TextView 所以我们宣告成一个类别让该列的setTag属性去读取 public class TagView{ Button button; ImageView image; TextView text; public TagView(Button button,ImageView image, TextView text){ this.button = button; this.image = image; this.text = text; } } 接着我们在getView 方法里面去读取它 TagView tag; tag = new TagView( (Button)view.findViewById(R.id.AdapterButton), (ImageView)view.findViewById(R.id.AdapterImage), (TextView)view.findViewById(R.id.AdapterText)); view.setTag(tag); 再来就是设定三个元件上面的图或文字 tag.image.setBackgroundResource(R.drawable.icon); tag.button.setText("button"+position); tag.text.setText("text"+position); 这样一来全部设定好了 可以将该列的view回传了 return view; 如此一来我们自制的ListView就大功告成 如果你照上面的程序走 应该可以看到这样的一个画面 http://ppt.cc/J7H( 如果没有成功 没关系 下载这个档案 慢慢参考研究一下 应该不会很难 http://rapidshare.com/files/455515390/MyListView.zip 如果哪边有说错 请千万要指正我 避免误导大家 谢谢 PS. 也可以乱改一下 http://ppt.cc/NDpt 顺序随便设定 PS2. 有人反映ListView点它没反应 这是因为塞入了Button的关系 Focus的属性被Button抢走了 所以你只要在xml档案里面 把Button的属性加上这行 android:focusable="false" 就会发现可以点选ListView了 参考网页 http://iamshiao.blogspot.com/2010/12/androidbaseadapterlistview.html http://www.iteye.com/topic/540423 http://developer.android.com/reference/android/widget/ListView.html http://developer.android.com/reference/android/widget/BaseAdapter.html http://disanji.net/2010/11/25/android-baseadapter-spinner-listview-gridview/ --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.64.84.230 ※ 编辑: givemepass 来自: 61.64.84.230 (04/02 16:01)
1F:推 nowar100:首推 晚点帮您收 04/02 20:04
2F:推 ericinttu:推一个 04/02 20:06
3F:推 diousk:PUSH! 04/02 21:54
4F:推 nvidia:http://tinyurl.com/3ffzols sonyericsson的开发者BLOG 04/02 21:55
5F:→ nvidia:也有source code 04/02 21:55
6F:推 tomap41017:大推!太强了 04/02 22:27
7F:→ nowar100:已收录 04/03 00:36
8F:推 hrs113355:推 04/03 01:35
9F:→ givemepass:sonyericsson 3D的那个太酷了 来学一下 感谢给资讯:) 04/03 11:25
10F:推 tn1031:推 04/03 14:56
11F:推 mickeychacha:推 04/09 14:54
12F:推 sorrel20567:推!!!!!这非常实用 04/09 22:11
13F:推 laiis:推!这招厉害 04/17 13:31
14F:推 donnolove:推! 很受用 05/02 19:55
15F:推 rize0528:感谢教学,另外请问如何在getView的时候得知row高? 06/24 01:40
16F:推 indicate:推~ 12/23 16:22
17F:推 kokdog1204: 推 05/23 01:05







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP