2010-03-03 3 views
14

spinner을 만들고 있는데 OnItemSelectedListener을 추가했습니다. 그러나 생성시 발생한다는 사실을 알았습니다. 무시하고 폐기하는 방법이 있는지 궁금합니다.작성시 OnItemSelectedListener가 실행되지 않음

내가 boolean 값을 사용할 수 있다는 것을 알았지 만, 그것은 "더러운"것입니다.

답변

0

다른 사람이이 질문을하는 경우이 문제를 해결하는 방법에 대한 좋은 아이디어가있는 답변이 여러 개있는 a related question I asked a while ago을 살펴볼 필요가 있습니다.

+0

청취자와 관련된 다른 문제가 있습니다. OnItemSelected 메서드에서 비동기 작업을 시작한 다음 getLastNonConfigurationInstance를 회전하면 onRetainNonConfigurationInstance에 저장 한 작업에 대해 null이 반환됩니다. 하지만 코드를 oncreate에 넣으면 잘 작동 할 것입니다. – Maxrunner

+0

당신은 우리에게 2 답을 알려주고 있다고 말하지 않았습니다. – cosmincalistru

+3

@cosmincalistru : 링크를 수정했습니다. 당시 브라우저 URL에 붙여 넣기 한 내용을 복사했는데, 문제가 아니라 대답이라는 것을 깨닫지 못했습니다. 어쩌면 시간이 지나면 나 자신을 용서하게 될거야. –

1

OnItemSelectedListener에 대한 호출을 막아서는 안됩니다.

기본적으로 Android 스피너는 어댑터에서 반환 한 첫 번째 항목을 선택하므로 OnItemSelectedListener이 호출되어 해당 항목에 대한 일부 작업이 트리거됩니다.

귀하의 회 전자 어댑터의 첫 번째 항목은 빈 항목이어야하며 귀하의 OnItemSelectedListener은 해당 ID를 기반으로 해당 항목을 무시할 수 있다고 조언합니다.

2

여기 내 해결책이 있습니다.

Route Grade Spinner와 Route Checkbox 사이에 종속성이 있으므로 첫 번째 항목 선택 이벤트를 무시해야합니다.

내 모든 컨트롤은 이전 활동 방문을 기반으로 설정됩니다.

// 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); 
      } 
     } 
    }); 
} 
1

이 정보는 도움이 될 수 있습니다.

@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 
    } 
} 
+0

작동하지 않음 :-( – sourcerebels

0

그럼 내가 나를 위해 좋은 해결책을 찾은 것 같아요, 제가 처음부터 마음에 그것을했다하지만 ... 가 나는 사용자 정의 래퍼 클래스 안드로이드 핸들러를 기반으로 한 그는 DoLater라고, 또한 사용자 정의 어댑터가 있습니다 리스너를 기반으로 복사 붙여 넣기하지만 당신은 아이디어를 얻을 것이다. 위험한 것은 어떻게 든 지연 500은 길어질 수 있고보기는 이미 파괴 될 수 있습니다 (사용자가 유선 물건을 빠르게하거나 휴대 전화가 느려지는 경우). DoLater는이 점을 고려하여 활동이 재개되지 않을 때 호출되지 않습니다. 그러나이 방법으로 OnItemSelectedListener는 생성시에 실행되지 않습니다.

public void onResume() { 
    super.onResume(); 
    new DoLater(this, 500) { 
       public void run() { 
        new OnSpinnerSelectedAdapter(getBowSpinner()) { 
         protected void onItemSelected(int position) { 
          onBowSelected(position); 
         } 
        }; 
       } 
      }; 
} 
관련 문제