web版本的項目中有這樣一個功能,動態新增連絡人...,並且可以修改,如:
可以由上面四圖明顯可以看出web上面的連絡人功能,最多可以有七個列表,每個列表選擇好了以後,又可以修改,如d圖。前面選擇好的連絡人,後面則不能選,因為沒有資料。
移植到android:
我在android上想要實現這樣一個功能,一個Activity中有一個spinner,當我點擊spinner其中的某一條的時候便彈出一個對話方塊。
於是我想到了setOnItemClickListener這個方法,測試發現有異常,一查源碼發現:A spinner does not support item click events. Calling this method will raise an exception. 所以覺得這條路可能是走不同了。
於是我便實現了這個方法:setOnItemSelectedListener,下面是我的關鍵代碼:
taskContactsSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
AlertDialog.Builder builder = new AlertDialog.Builder(SpinnerTest.this);
builder.setTitle("Contacts");
builder.setItems(mItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//點擊後快顯視窗選擇了第幾項
new AlertDialog.Builder(SpinnerTest.this)
.setMessage("你選擇的id為" + which + " , " + mItems[which])
.show();
}
}).show();
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
以上代碼中的onItemSelected方法裡面的語句為彈出一個對話方塊。
測試發現:當我一進入Activity的時候,onItemSelected中的語句便自動執行了,而我要的效果是,只有當我點擊spinner中的某一條的時候,才能彈出該對話方塊。看到網上很多人說可以setSelect(0,false)可以防止一開始進入Activity便執行onItemSelected中的語句,表面上看效果是的,但實際上這樣做只是掩耳盜鈴,很多人可以發現,這樣做了以後開啟spinner點擊第一條是沒有動作執行的,只有點擊其他的條數在反過來點擊第一條才會有反映,但是如果前後兩次點擊相同的條目的話,第二次的點擊也是無效的,那這是為什麼呢?
帶著這個疑問,我又查看了源碼發現:onItemSelected這個方法是當spinner中的內容有改變的時候才會觸發,雖然我們表面上spinner的資料沒有什麼變化,但是當我們點擊的條目的id變化時,其內部是看作spinner有變化的,關鍵代碼:
if (mDataChanged) {
handleDataChanged();
}
既然如此,便可以解釋上面的問題了,兩次點擊同樣的條目,是沒有任何動作會發生的。一開始進入Activity的時候,spinner中有了資料肯定也是變化了,所以便會執行onItemSelected中的語句,所以一開始便會彈出一個對話方塊。
後來我又想到加入boolean標誌來判斷是否第一次進入activity等方法,發現效果都不能達到想象中的。