2012-04-03 168 views
3

我遇到了我創建的ListView問題:我想要一個項目在我點擊它時被選中。Android ListView:如何選擇一個項目?

我給這家代碼如下所示:

protected void onResume() { 
... 
ListView lv = getListView(); 
lv.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) { 
     Log.v(TAG, "onItemSelected(..., " + pos + ",...) => selected: " + getSelectedItemPosition()); 
    } 
    public void onNothingSelected(AdapterView<?> adapterView) { 
     Log.v(TAG, "onNothingSelected(...) => selected: " + getSelectedItemPosition()); 
    } 
}); 
lv.setOnItemClickListener(new OnItemClickListener() 
{ 
    public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) { 
     lv.setSelection(pos);    
     Log.v(TAG, "onItemClick(..., " + pos + ",...) => selected: " + getSelectedItemPosition());    
    } 
}); 
... 
} 

當我運行這一點,例如點擊在第二項(即POS = 1),我得到:

04-03 23:08:36.994: V/DisplayLists(663): onItemClick(..., 1,...) => selected: -1 

即即使OnItemClickListener被調用合適的參數,並調用爲setSelection(1),沒有選擇的(因此也OnItemSelectedListener項目。 onItemSelected(...)永遠不會被調用),getSelectedItemPosition()在setSelection(1)調用後仍然返回-1。

我錯過了什麼?

邁克爾

PS:我的目錄確實有> = 2元......

回答

8

這裏缺少的元素是choiceMode。這並不是非常好,但默認情況下,android中的ListViews(以及擴展名,從AbsListView繼承的任何東西,比如GridView等)不允許選擇,但可以啓用它 - 無論是在XML中還是在代碼中:

在XML:

<ListView 
    ... 
    android:choiceMode="singleChoice" /> 

代碼:

mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 

注意,一旦你這樣做,Android將setSelection()你,所以你並不需要跟蹤它自己。在這一點上你的onClickListener只是爲了節省挑選,我甚至不與理會OnSelectedItemListener:

@Override 
public void onItemClick(final AdapterView<?> list, final View v, 
    final int position, final long id) { 
    Participant p = mAdapter.getParticipantForId(id); 
    eventManager.fire(new ParticipantSelectedEvent(p)); 
    pxList.smoothScrollToPosition(position); // Make sure selection is plainly visible 
} 
+2

爲什麼這是低調,完全是?它解決了getSelectedItemPosition()的海報問題永遠不會改變。是的,如果他想要的只是有問題的項目,那麼onItemClick()中的getItemAtPosition肯定更容易。然而,choiceMode能夠**顯示用戶當前選擇哪個項目,以及讓程序員訪問它。 – JRaymond 2012-04-04 15:08:41

+1

我添加了選擇模式(兩種變體),但沒有改變! OnItemClickListener仍然不會被調用。即使我在屏幕上看到一個反應,即該物品很快變成紫色,然後又變回白色。 奇怪的是,我可以通過點擊向上和向下按鈕(然後調用OnIemSelectListener)來選擇項目,但顯然不通過OnItemClickListener。 – mmo 2012-04-04 20:55:18

+0

等等,所以OnItemClick永遠不會被調用? OnItemSelect偵聽器僅針對觸控板/ up up東西配置 - 它不響應點擊,我不知道它是否會響應setSelection的手動撥號 – JRaymond 2012-04-04 21:01:34

2

試試這個: -

ListView lv = getListView(); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 

      // selected item 
      String product = ((TextView) view).getText().toString(); 

     Toast.makeText(getApplicationContext(), "Selected Item :" +product, Toast.LENGTH_SHORT).show(); 

     } 
    }); 

希望它會幫助你。

1

我剛剛意識到,我完全沒有。在觸摸模式下,選擇一個項目根本沒有意義。您只需直接點擊它(並調用OnClickListener 即可調用)。 我剛開始明白,Android會照顧所有這些不同的設備,它們都有方向控制按鈕,觸摸屏等等。想象一下,如何在設備上執行某項操作並不容易用於或不能進行測試。