一、不使用xml布局文件創(chuàng)建一個ListView
- 創(chuàng)建一個名稱為HelloListView的Android工程,可以參見Android教程之三:第一個Android應用,HelloWorld。
- 要使用ListView,需要讓你的Activity繼承于ListActivity,這個和以前的有區(qū)別,以前的都是繼承Activity,該ListActivity繼承Activity,擴展了很多常用的用于操作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[]{"中國","俄羅斯","英國","法國"};
- }
- 運行程序效果如下:
看到了吧,我們的數(shù)據(jù)已經(jīng)通過列表的形式顯示了出來?。。?/span>這里主要的是使用了一個Adapter—適配器,你可以把他看成是ListView的數(shù)據(jù)源,ListView要展示的數(shù)據(jù)都是已Adapter的形勢傳遞給ListView的。這個Adapter很重要,Android的用于傳給集合控件(ListView,Spinner,GridView等)的數(shù)據(jù)都是以Adapter的形勢,這樣的好處就是只要掌握了Adapter,就可以很隨意的給這些集合控制傳遞數(shù)據(jù),因為他們使用的都是Adapter。適配器適配器關(guān)鍵就是適配,只需公布一個Adapter,就全搞定了。Android已經(jīng)給我們實現(xiàn)了一些常用的適配器,如剛剛使用的數(shù)組適配器,還有簡單適配器等,如果這些不能滿足,我們還可以通過自定義適配器來實現(xiàn)自己的適配器。其實一種適配器就對應了一個集合控件中的一個元素的布局展示。
二:使用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.android.com/apk/res/android"
- android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#FF0000FF"
- >
- </ListView>
這里要注意的是我們設(shè)置ListView的id為”@android:id/list”,意思是我們引用Android已經(jīng)為我們定義好的一個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。 - 運行效果圖:
背景已經(jīng)變成了藍色,說明我們在xml中定義的ListView起作用了。
三:自定義要展示的元素
- 前面的兩個例子都是展示一行文字,如果我們想圖文混排怎么做呢,比如前面是文字,后面是圖片。要實現(xiàn)這種功能就需要我們自定義Adapter啦。
- 新建布局文件item.xml,內(nèi)容如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/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已經(jīng)實現(xiàn)了Adapter的大部分方法,我們繼承后只需要實現(xiàn)部分的方法即可。必須實現(xiàn)的就是getCount和getView方法,前一個是返回ListView中有多少個元素,后一個是生成要展示的View。ListView在每添加一個View是就會調(diào)用Adapter的getView方法,所以我們有必要對這個方法做優(yōu)化,例子中就做了部分的優(yōu)化,一般面試的時候會被問到ListView優(yōu)化,回答例子中的這些代碼就差不多了。 - 運行,我們會看到效果如圖:
四、ListView列表中的元素的單擊事件響應
如果我們要想單擊一個ListView的元素使其作出相應的響應怎么辦呢?比如彈出什么,打開什么,展示什么等等,那么我們只需要實現(xiàn)單擊事件的函數(shù)既可。
要實現(xiàn)ListView的單擊事件有兩種方法,一個是使用getListView().setOnClickListener(l);設(shè)置,這個和平時我們用的控件設(shè)置是一樣的,不做介紹,下面介紹第二個,就是重寫ListActivity的onListItemClick方法,其實這個的最后處理也是ListView的setOnClickListener進行監(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();
運行單擊其中的一行效果如下圖:
五、小結(jié)
到這里ListView應該算是會使用了,起碼常用的功能會的,當然還有很多沒有說到的,比如ListView的分割部分,headView和footView以及ListView的分頁等等,這些就需要我們自己下去好好摸索了。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。