上一篇:http://www.bkjia.com/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檔案緊密的結合在一起。My Code中用到了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,是非常重要滴。另外,理解函數的依賴的基礎,也是很重要滴,不是能簡單的調用就可以滴,要深入理解隱藏在背後的東西。
摘自 愛心覺羅氏