一、
不使用
xml
布局文件創(chuàng)建一個
ListView
-
創(chuàng)建一個名稱為
HelloListView
的
Android
工程,可以參見
Android教程之三:第一個Android應用,HelloWorld
。
-
要使用
ListView
,需要讓你的
Activity
繼承于
ListActivity
,這個和以前的有區(qū)別,以前的都是繼承
Activity
,該
ListActivity
繼承
Activity
,擴展了很多常用的用于操作
ListView
的方法,使用很方便。
-
現修改
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[]{"中國","俄羅斯","英國","法國"};
- }
-
運行程序效果如下:
 看到了吧,我們的數據已經通過列表的形式顯示了出來?。。?/span>
這里主要的是使用了一個
Adapter—
適配器,你可以把他看成是
ListView
的數據源,
ListView
要展示的數據都是已
Adapter
的形勢傳遞給
ListView
的。這個
Adapter
很重要,
Android
的用于傳給集合控件(
ListView,Spinner,GridView
等)的數據都是以
Adapter
的形勢,這樣的好處就是只要掌握了
Adapter
,就可以很隨意的給這些集合控制傳遞數據,因為他們使用的都是
Adapter
。適配器適配器關鍵就是適配,只需公布一個
Adapter
,就全搞定了。
Android
已經給我們實現了一些常用的適配器,如剛剛使用的數組適配器,還有簡單適配器等
,
如果這些不能滿足,我們還可以通過自定義適配器來實現自己的適配器。其實一種適配器就對應了一個集合控件中的一個元素的布局展示。
二:
使用
xml
來自定義
ListView
-
上個例子我們并沒有使用在
main.xml
中定義一個
ListView
的形勢來布局
ListView
,而是使用的
ListActivity
中默認的
ListView
來演示的。
-
下面就使用我們在
main.xml
中自定義的
ListView,
這樣我們可以很方便的控制
ListView
展示的布局,大小,背景色等屬性。當然上個例子中我們一樣可以通過
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>
這里要注意的是我們設置
ListView
的
id
為
”@android:id/list”,
意思是我們引用
Android
已經為我們定義好的一個
id
,名字是
list
,如果你不定義成這樣,這個
ListView
是不能被
ListActivity
識別的。然后就是添加了一個藍色的背景,看看我們這個自定義的
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[]{"中國","俄羅斯","英國","法國"};
- }
比上個例子只是多了
setContentView(R.layout.
main
);
是為了讓
Android
識別我們定義的
ListView
。
-
運行效果圖:
 背景已經變成了藍色,說明我們在xml中定義的ListView起作用了。
三:
自定義要展示的元素
-
前面的兩個例子都是展示一行文字,如果我們想圖文混排怎么做呢,比如前面是文字,后面是圖片。要實現這種功能就需要我們自定義
Adapter
啦。
-
新建布局文件
item.xml,
內容如下:
- <?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>
這里主要定義一個
TextView
和一個
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[]{"天氣","我團","背景"};
-
- private int[] images=new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3};
- }
這里的主要地方是自定義了一個
Adapter
,我們只需要繼承
BaseAdapter
即可,
BaseAdapter
已經實現了
Adapter
的大部分方法,我們繼承后只需要實現部分的方法即可。必須實現的就是
getCount
和
getView
方法,前一個是返回
ListView
中有多少個元素,后一個是生成要展示的
View
。
ListView
在每添加一個
View
是就會調用
Adapter
的
getView
方法,所以我們有必要對這個方法做優(yōu)化,例子中就做了部分的優(yōu)化,一般面試的時候會被問到
ListView
優(yōu)化,回答例子中的這些代碼就差不多了。
-
運行,我們會看到效果如圖:

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

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