我正在創建一個spinner
,並且我已經爲它添加了一個OnItemSelectedListener
。但我注意到它在創建時觸發。 現在我想知道是否有辦法忽略/丟棄它。忽略OnItemSelectedListener在創建時觸發
我知道我可以使用boolean
值,但這有點「髒」。
我正在創建一個spinner
,並且我已經爲它添加了一個OnItemSelectedListener
。但我注意到它在創建時觸發。 現在我想知道是否有辦法忽略/丟棄它。忽略OnItemSelectedListener在創建時觸發
我知道我可以使用boolean
值,但這有點「髒」。
如果任何人遇到了這個問題,它可能是值得擁有看看a related question I asked a while ago,其中有幾個答案就如何解決這個問題的好點子。
您不應該試圖阻止對OnItemSelectedListener
的調用。
默認情況下,Android的紗廠選擇由適配器返回的第一個項目,因此OnItemSelectedListener
被調用來觸發該項目的一些動作。
我想提醒你的微調適配器的第一個項目是一個空白的項目,您可以OnItemSelectedListener
根據ID忽略空白項。
這是我的解決方案。
我需要忽略第一個項目選擇事件,因爲Route Grade微調器和Route複選框之間存在依賴關係。
而我所有的控件都是基於上次訪問活動設置的。
// Used to count the number of times the onItemSelected gets fired
private int mGradeSelectionCount = 0;
private void attachHandlers() {
OnItemSelectedListener gradeRangeSelectionMadeListener;
gradeRangeSelectionMadeListener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View view, int position, long id) {
// If the counter is 0 then we can assume that it is android firing the event
if (mGradeSelectionCount++ < 1) {
return;
}
if (mCmbGradeFrom.getSelectedItemPosition() == 0) {
// Uncheck the Route checkbox
mChkTypeRoute.setChecked(false);
} else {
// Check the Route checkbox
mChkTypeRoute.setChecked(true);
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// Dont care, keep the same values as before
}
};
mCmbGradeFrom.setOnItemSelectedListener(gradeRangeSelectionMadeListener);
mChkTypeRoute.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (!isChecked) {
mCmbGradeFrom.setSelection(0);
mCmbGradeTo.setSelection(0);
}
}
});
}
這可能對你有幫助。
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if(view!=null && view.getId()!=0){
//do your code here to avoid callback twice
}
}
沒有工作:-( – sourcerebels 2013-11-12 16:57:01
嗯,我想我找到了很好的解決方案對我來說,我是有一點,從開始,但... 我已經基於Android上的處理器定製的包裝類,被稱爲DoLater,也有自定義適配器基於聽衆,所以你不能複製粘貼,但你會明白。危險的事情就是延遲500可能會延長,並且View可能已經被破壞(當用戶快速地做一些有線的事情或者手機變慢時),所以DoLater會關心它,所以當活動沒有恢復時它不會被調用。但是這種方式OnItemSelectedListener不會在創建時觸發。
public void onResume() {
super.onResume();
new DoLater(this, 500) {
public void run() {
new OnSpinnerSelectedAdapter(getBowSpinner()) {
protected void onItemSelected(int position) {
onBowSelected(position);
}
};
}
};
}
我與聽者的另一個問題。如果我從OnItemSelected方法觸發一個異步任務,然後旋轉getLastNonConfigurationInstance會爲我在onRetainNonConfigurationInstance上保存的任務返回null。但是如果我把代碼外面的oncreate它會工作得很好.... – Maxrunner 2011-12-21 20:30:19
你沒有告訴你指出我們2你的答案了。 – cosmincalistru 2012-09-26 14:43:11
@cosmincalistru:修正了鏈接 - 我剛剛複製粘貼了當時瀏覽器URL中的內容,但沒有意識到這是一個答案,而不是問題。或許,我會及時原諒自己。 – 2012-09-27 00:17:47