作者givemepass (〆)
看板AndroidDev
标题[分享] BaseAdapter 自定ListView
时间Sat Apr 2 14:47:30 2011
前一阵子在研究怎麽自订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
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