一、
不使用
xml
布局文件創(chuàng)建一個(gè)
ListView
-
創(chuàng)建一個(gè)名稱為
HelloListView
的
Android
工程,可以參見
Android教程之三:第一個(gè)Android應(yīng)用,HelloWorld
。
-
要使用
ListView
,需要讓你的
Activity
繼承于
ListActivity
,這個(gè)和以前的有區(qū)別,以前的都是繼承
Activity
,該
ListActivity
繼承
Activity
,擴(kuò)展了很多常用的用于操作
ListView
的方法,使用很方便。
-
現(xiàn)修改
HelloListView
類如下
:
- public class HelloListView extends ListActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
-
- setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));
- }
-
- private static final String[] COUNTRIES=new String[]{"中國","俄羅斯","英國","法國"};
- }
-
運(yùn)行程序效果如下:
 看到了吧,我們的數(shù)據(jù)已經(jīng)通過列表的形式顯示了出來?。?!
這里主要的是使用了一個(gè)
Adapter—
適配器,你可以把他看成是
ListView
的數(shù)據(jù)源,
ListView
要展示的數(shù)據(jù)都是已
Adapter
的形勢(shì)傳遞給
ListView
的。這個(gè)
Adapter
很重要,
Android
的用于傳給集合控件(
ListView,Spinner,GridView
等)的數(shù)據(jù)都是以
Adapter
的形勢(shì),這樣的好處就是只要掌握了
Adapter
,就可以很隨意的給這些集合控制傳遞數(shù)據(jù),因?yàn)樗麄兪褂玫亩际?/span>
Adapter
。適配器適配器關(guān)鍵就是適配,只需公布一個(gè)
Adapter
,就全搞定了。
Android
已經(jīng)給我們實(shí)現(xiàn)了一些常用的適配器,如剛剛使用的數(shù)組適配器,還有簡單適配器等
,
如果這些不能滿足,我們還可以通過自定義適配器來實(shí)現(xiàn)自己的適配器。其實(shí)一種適配器就對(duì)應(yīng)了一個(gè)集合控件中的一個(gè)元素的布局展示。
二:
使用
xml
來自定義
ListView
-
上個(gè)例子我們并沒有使用在
main.xml
中定義一個(gè)
ListView
的形勢(shì)來布局
ListView
,而是使用的
ListActivity
中默認(rèn)的
ListView
來演示的。
-
下面就使用我們?cè)?/span>
main.xml
中自定義的
ListView,
這樣我們可以很方便的控制
ListView
展示的布局,大小,背景色等屬性。當(dāng)然上個(gè)例子中我們一樣可以通過
getListView
獲取
ListView
后使用它的方法來改變布局、大小和背景色等。
-
修改
main.xml
為:
- <?xml version="1.0" encoding="utf-8"?>
- <ListView xmlns:android="http://schemas./apk/res/android"
- android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FF0000FF"
- >
- </ListView>
這里要注意的是我們?cè)O(shè)置
ListView
的
id
為
”@android:id/list”,
意思是我們引用
Android
已經(jīng)為我們定義好的一個(gè)
id
,名字是
list
,如果你不定義成這樣,這個(gè)
ListView
是不能被
ListActivity
識(shí)別的。然后就是添加了一個(gè)藍(lán)色的背景,看看我們這個(gè)自定義的
ListView
是否起了作用。
-
修改
HelloListView
類為:
- public class HelloListView extends ListActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,COUNTRIES));
- }
-
- private static final String[] COUNTRIES=new String[]{"中國","俄羅斯","英國","法國"};
- }
比上個(gè)例子只是多了
setContentView(R.layout.
main
);
是為了讓
Android
識(shí)別我們定義的
ListView
。
-
運(yùn)行效果圖:
 背景已經(jīng)變成了藍(lán)色,說明我們?cè)趚ml中定義的ListView起作用了。
三:
自定義要展示的元素
-
前面的兩個(gè)例子都是展示一行文字,如果我們想圖文混排怎么做呢,比如前面是文字,后面是圖片。要實(shí)現(xiàn)這種功能就需要我們自定義
Adapter
啦。
-
新建布局文件
item.xml,
內(nèi)容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas./apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/text"
- android:layout_alignParentLeft="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <ImageView
- android:id="@+id/image"
- android:layout_alignParentRight="true"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- </RelativeLayout>
這里主要定義一個(gè)
TextView
和一個(gè)
ImageView
,用于顯示列表每一行的文本和圖片
-
修改
HelloListView
類如下:
- public class HelloListView extends ListActivity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- setListAdapter(new TextImageAdapter(this));
- }
-
-
-
-
-
- private class TextImageAdapter extends BaseAdapter{
- private Context mContext;
- public TextImageAdapter(Context context) {
- this.mContext=context;
- }
-
-
-
- public int getCount() {
- return texts.length;
- }
-
- public Object getItem(int position) {
- return null;
- }
-
- public long getItemId(int position) {
- return 0;
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
-
- if(convertView==null){
- convertView=LayoutInflater.from(mContext).inflate(R.layout.item, null);
- ItemViewCache viewCache=new ItemViewCache();
- viewCache.mTextView=(TextView)convertView.findViewById(R.id.text);
- viewCache.mImageView=(ImageView)convertView.findViewById(R.id.image);
- convertView.setTag(viewCache);
- }
- ItemViewCache cache=(ItemViewCache)convertView.getTag();
-
- cache.mTextView.setText(texts[position]);
- cache.mImageView.setImageResource(images[position]);
- return convertView;
- }
- }
-
- private static class ItemViewCache{
- public TextView mTextView;
- public ImageView mImageView;
- }
-
- private String[] texts=new String[]{"天氣","我團(tuán)","背景"};
-
- private int[] images=new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3};
- }
這里的主要地方是自定義了一個(gè)
Adapter
,我們只需要繼承
BaseAdapter
即可,
BaseAdapter
已經(jīng)實(shí)現(xiàn)了
Adapter
的大部分方法,我們繼承后只需要實(shí)現(xiàn)部分的方法即可。必須實(shí)現(xiàn)的就是
getCount
和
getView
方法,前一個(gè)是返回
ListView
中有多少個(gè)元素,后一個(gè)是生成要展示的
View
。
ListView
在每添加一個(gè)
View
是就會(huì)調(diào)用
Adapter
的
getView
方法,所以我們有必要對(duì)這個(gè)方法做優(yōu)化,例子中就做了部分的優(yōu)化,一般面試的時(shí)候會(huì)被問到
ListView
優(yōu)化,回答例子中的這些代碼就差不多了。
-
運(yùn)行,我們會(huì)看到效果如圖:

四、ListView
列表中的元素的單擊事件響應(yīng)
-
如果我們要想單擊一個(gè)
ListView
的元素使其作出相應(yīng)的響應(yīng)怎么辦呢?比如彈出什么,打開什么,展示什么等等,那么我們只需要實(shí)現(xiàn)單擊事件的函數(shù)既可。
-
要實(shí)現(xiàn)
ListView
的單擊事件有兩種方法,一個(gè)是使用
getListView().setOnClickListener(l
);
設(shè)置,這個(gè)和平時(shí)我們用的控件設(shè)置是一樣的,不做介紹,下面介紹第二個(gè),就是重寫
ListActivity
的
onListItemClick
方法,其實(shí)這個(gè)的最后處理也是
ListView
的
setOnClickListener
進(jìn)行監(jiān)聽調(diào)用的。
-
在
HelloListView
類中增加如下代碼:
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- Toast.makeText(this, "你單擊了"+texts[position], Toast.LENGTH_SHORT).show();
-
運(yùn)行單擊其中的一行效果如下圖:

五、小結(jié)
到這里L(fēng)istView應(yīng)該算是會(huì)使用了,起碼常用的功能會(huì)的,當(dāng)然還有很多沒有說到的,比如ListView的分割部分,headView和footView以及ListView的分頁等等,這些就需要我們自己下去好好摸索了。
分享到:
|