Android項目技術總結:項目中選擇任務的連絡人引出android的spinner的監聽問題

來源:互聯網
上載者:User

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等方法,發現效果都不能達到想象中的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.