2011-03-28 137 views
2

調用ListView的setSelection()似乎有問題。很多人都會問這個問題。有答案,但沒有任何工作。忽視視覺影響的問題。這裏是導致意想不到的結果基本方案:listView.setSelection(n); M = listView.getSelectedItemPosition(); // m!= n。爲什麼?

listView.setSelection(5); //listView is a ListView. there are >= 6 items in the list 
int sel=listView.getSelectedItemPosition(); 

你所期望的SEL == 5,但實際上它是-1(這方法沒有工作?)
所以這是一個錯誤,如果沒有,有什麼管理所選項目的設置和檢索的規則是什麼?

回答

2

如果您爲setSelection的文檔中看到你發現這一點:

設置當前選擇的項目。如果在觸摸模式下使用 ,該項目將不會被選中 ,但它仍然會被定位爲 。如果 指定的選擇位置比 小於0,則將選擇位置0 處的項目。

這樣,它返回-1是完全合理的。即使您在處於觸摸模式時運行此方法,也不會選擇該項目,正如您最可能的那樣。

+0

這是什麼意思**,但它仍然會被適當定位**? – inor 2011-03-28 09:21:57

+0

我還沒有嘗試過,但我想這意味着該項目將在屏幕的中心,或至少它將在視圖中。 – 2011-03-28 09:53:06

+0

謝謝。我想知道,如果setSelection方法由於它當前處於的模式(觸摸模式)而沒有做任何事情時拋出RuntimeException,那麼它是否更有意義。這可能會節省大量的時間和問題,因爲通話的行爲就像一切正常一樣,並且它已經執行了你所要求的...... – inor 2011-03-28 10:39:45

0

我同意Eric的回答。但是,如果您仍想使其工作,這是一個解決方法。

您onItemClick部分使用下面的(我有多個列表視圖...)

public void onItemClick(AdapterView<?> parentView, View v, int chosenPosition, long  
myLong) { 
    switch(parentView.getId()){ 
    case R.id.Hrlist: 
     parentView.setSelection(chosenPosition); 
     break; 
    case R.id.Minlist: 
     parentView.setSelection(chosenPosition); 
     break; 
    case R.id.Seclist: 
     parentView.setSelection(chosenPosition); 
    } 
} 

然後在您的另一種方法,你可以沿着線使用的東西:

HrList.getFirstVisiblePosition(); 

假設HrList被定義爲

ListView HrList = (ListView) findViewById(R.id.Hrlist); 

所以是的,在觸摸模式下它不會註冊該項目爲sele反恐執行局。但是,它會將其移動到可靠的位置(即位於頂部),您可以使用該位置獲取該值。