第二個Activity和Android ListView控件

上一篇:/kf/201203/121466.html

上一個Activity中已經看到,start的是第二個Activity。寫程序的都覺得程序理解起來比較容易,還是先奉上代碼。
先看list_item.xml文件:
1 <?xml version="1.0" encoding="utf-8"?>
2
3 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
4     android:layout_width="fill_parent"
5     android:layout_height="fill_parent"
6     android:padding="10dp"
7     android:textSize="16sp" >
8 </TextView>

xml文件很簡單,就一個TextView,用來顯示List中的每一個item。這個是在eclipse中GraphLayout中拖進去,自動生成。其中需要註意的是textSize這個可以修改,它決定瞭字體的大小。這裡字體的單位是sp。
下面來看Java代碼:
 1 package Workshop.english.englishwords;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.widget.*;
 6 import android.view.*;
 7 import android.app.ListActivity;
 8 import android.content.Intent;
 9 import android.widget.AdapterView;
10 import android.widget.AdapterView.OnItemClickListener;
11        
12 /* This list activity list all unit1~12 */
13 public class UnitListAdapter extends ListActivity {
14    
15
16     @Override
17     protected void onCreate(Bundle savedInstanceState)
18     {
19        
20         super.onCreate(savedInstanceState);
21        
22         setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, UNIT_NAME));
23         ListView lv = getListView();
24         lv.setTextFilterEnabled(true);             
25        
26         lv.setOnItemClickListener(new OnItemClickListener() {
27             public void onItemClick(AdapterView<?> parent, View view,
28                                                int position, long id) {
29                
30                 Intent intent = new Intent(UnitListAdapter.this, WordActivity.class);
31                 startActivity(intent);                                  
32             }
33         });
34     }
35    
36     static final String[] UNIT_NAME = new String[] {
37         "unit1", "unit2", "unit3", "unit4", "unit5", "unit6"};   
38 }

代碼其實很簡單。我一直崇尚簡單。簡單容易理解。特別對於初學者,簡單的代碼使人能抓住重點,不會迷失。
註意到這裡用到的關鍵控件是ListView。ListView控件在我們看到的應用中使用十分廣泛,我們最常見的app store中找需要的app時,看到的就是是ListView。
所以在這裡繼承的是ListActivity,而不是 直接繼承於Activity。和ListView密切的一個東西就是listAdapter。
 在這裡,反映瞭MVC的模式。M是模式,其實是數據源,V是視圖,是顯示數據的,C是控制,是控制數據的,它是聯系M和V的紐帶。
在這裡例子裡,可以把我定義的靜態的String數組看作是M,ListView看作是V,而listAdapter就是C。那麼,可以這麼說,adapter就是將String數組中的數據,也就是那些string顯示到ListView中。line 22  的函數調用正反映瞭這個過程。
接下來的一個關鍵是定義每個item上的click,也就是,我希望和我們使用app store的經驗一項,點一下一個item,便會在下一個屏幕中顯示item的內容。
所以,這裡給ListView給item設置瞭事件監聽,line 26實現瞭這個設置。在listener中實現瞭onItemClick方法,目的是切換到另一個Activity—-WordActivity。
 
這個程序,不得不說的是,它可能過於簡單。一個方面,隻有一個簡單的ListView,第二個方面,ListView中的隻有簡單的幾個數據,最後,在監聽到事件之後,隻是簡單的切換到另一個Activity。
為什麼這麼簡單,主要是因為我做的是原型,原型不需要那麼復雜。簡單的容易控制。在最後的程序中,這裡的setListAdapter可以用其他更好的方法,另外還有兩種Adapter。最重要的是,數據源肯定不會是這樣的數組,關於數據存儲,大量的數據可以存在數據庫中,少量的數據可以以文件的形式存放。所以會有專門的類負責數據獲取。
總的來說,原型是沒有問題瞭,而且基本的元素也具備瞭,瞭解到瞭重要的控件ListView的各個方面。
最後,還是來分享下調試過程中積累的經驗。
開始寫程序的時候,基本上是找個例子模仿。
從官網上找瞭一個例子,模仿瞭一下。基本上,我是對的,但是,可惜的是,隻對瞭一半。前面說到的,Activity和xml文件緊密的結合在一起。我的代碼中用到瞭ListView,我從官網上找瞭一個ListView的例子模仿瞭一下,這是剛開始寫代碼的時候,不是麼?可是很不幸,官網上沒有xml的文件,我隻能自己根據自己的理解去寫xml。我的程序一運行就出問題。而且debug顯示,就處在ListView的這個Activity裡。但是到底在哪裡,還是未知。能看到代碼處在setViewAdapter調用的這一行,但是深入進去,卻看不到。

久攻不下,我還是選擇求助於網絡。在網上搜瞭很多的用到ListView的例子,仔細分析,找出和我的程序的差異。皇天不負苦心人,終於找到一個基本接近的例子。再看看,Java程序應該沒有什麼問題,差異就在xml文件裡。經驗告訴我,我的xml文件有問題。

看看我的xml文件,加的是一個LinearLayout,但是例子裡加的是TextView. Good,就按照例子中的加一個TextView, 結果,一下子就好瞭。

回頭仔細想想也是。因為ListView中的String需要顯示在TextView裡,如果沒有TextView,那麼用Adapter的時候,String數據就沒地方放。那麼分析下來,肯定是在setViewAdapter的函數裡找TextView沒有找到,所以出現瞭對象為空,故出錯。

這個經歷使我進一步認識到:xml,是非常重要滴。另外,理解函數的依賴的基礎,也是很重要滴,不是能簡單的調用就可以滴,要深入理解隱藏在背後的東西。
 

 摘自 愛心覺羅氏

發佈留言