문제

스피너에서 setSelection에 문제가 있습니다. 스피너가 코드에 표시 될 때 값을 사전 선택하도록 설정했지만 효과가 없으며 목록의 첫 번째 대안이 항상 선택됩니다. 코드는 다음과 같습니다.

    LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View dialogView = li.inflate(R.layout.edit_event, null);
    ...
    ArrayList<String> routes = new ArrayList<String>();
    // routes filled with values at runtime
    ...
    ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, android.R.layout.simple_spinner_item, routes);
    aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination);

    String dest = events.get(pos).getDestination();
    int routesPos = routes.indexOf(dest);
    Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
    destSpinner.setSelection(routesPos);

    destSpinner.setAdapter(aa);

코드는 setSelection-part를 제외하고 의도 된대로 작동하며 그 이유를 알 수 없습니다.

스피너의 XML 층은 다음과 같습니다 (전체 레이아웃이 아니라 스피너 부품 만) :

// DESTINATION
<TextView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="Destination:" />
<Spinner
   android:id="@+id/edit_event_destination"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:prompt="@string/choose_dest"
   android:layout_marginBottom="10dip"
   android:text="" />

도움을 주셔서 감사합니다!

리누스

도움이 되었습니까?

해결책

전화를 옮기십시오 setSelection() 전화 후 setAdapter().

다른 팁

나는 비슷한 문제가 있었다. 나의 경우에는 setAdaper 그리고 setSelection 올바른 순서대로! 실행 된 양식 onCreate 효과가 있었지만 실행되었을 때 onResume 효과가 없었습니다.

그만큼 해결책 전화하는 것입니다 setSelection(my_pos, true). 두 번째 매개 변수를 주목하십시오.

당신은 시도 할 수 있습니다

mSpinner.post(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  });

이것은보기가 만들어 지 자마자 실행할 수있는 런 가능한 조치를 게시합니다.

내 경우에는 답이 없었기 때문에 핸들러를 통해 setSelection을 대기했습니다.

new Handler().postDelayed(new Runnable() {        
    public void run() {
      mSpinner.setSelection(1);
    }
  }, 100);

이 작업을 수행하면 느린 장치에서 실행할 때 문제가 발생할 수 있지만 특정 장치에서 일하고 있어이 해킹을 사용해도 괜찮습니다.

해결책은 setSelection (my_pos, true)을 호출하는 것입니다. 두 번째 매개 변수를 주목하십시오.

잊지 마십시오. 애니메이션을 호출하면 설정 레이아웃 매개 변수를 잊지 마십시오. :) 예 : 예 :

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams();
spinner.setSelection(selectedPositionAge, true);
spinnerLp.gravity = Gravity.CENTER;
spinner.setLayoutParams(spinnerLp);

수동으로 설정된 패딩을 스피너로 수동으로 재설정해야합니다.

나는 내부의 스피너와 같은 문제가 있었다. fragment : setSelection 그 동안 올바르게 작동합니다 onCreate 활동이 처음 시작될 때 화면을 회전 할 때는 아닙니다. 나는 전화하여 그것을 해결했다 setSelectiononViewStateRestored 조각 내부를 호출하는 대신 조각의 방법 onCreate 방법. 확실하지 않지만 당신이 사용할 수 없다고 생각합니다 setSelection 가능하더라도보기가 완전히로드 될 때까지 findViewById 그것.

Spinner.setSelection() 전에 전화하면 작동하지 마십시오 Spinner.setAdapter()

전화 해보세요 setSelection() setAdapter ()로 호출 한 후.

이 뒤에 이유 : 전화 할 때 Spinner.Selection() 어댑터를 설정하기 전에 단순히 데이터가 포함되어 있지 않거나 Spinner가 Max Item = 0이라고 말할 수있는 경우 SetSelection ()에 의해 Spinner를 사용자 정의 색인으로 설정하려고한다는 것을 의미합니다.

그래서 setSelection(1) 최대 항목 = 0 인 스피너의 경우 인덱스를 1으로 설정하는 것을 의미합니다. Spinner 자체 가이 OutfboundIndex를 처리하므로 앱이 충돌하지 않습니다.

~에게 전화 해 SetSelection() SetAdapter () 만 이후에 있어야합니다

또한 당신이있는 경우 Spinner.SetOnItemSelectedListener() 그리고 당신은 그 문제가 있습니다 onItemSelected(AdapterView<?> parent, View view, int position, long id) 활동 하중이있을 때 위치 값 = 0으로 tggerged 후이 패턴을 사용해야합니다.

Spinner.SetAdapter()
Spinner.setSelection();
Spinner.setOnItemSelectedListener();

이것을 사용하십시오

    sp2.setAdapter(sp2.getAdapter());
    sp2.getAdapter().notifyDataSetChanged();
    sp2.setSelection(0, false);

이전 답변 중 어느 것도 저에게 도움이되지 않았습니다. 그러나 인스턴스 변수를 만드는 것이 효과가있는 것은 mSpinner 에서 onCreateView() 내 조각의 방법 (또는 onCreate() 당신의 활동 방법) onLoadFinished() 방법...

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    adapter.swapCursor(cursor);
    //mSpinner.setAdapter(adapter);
    mSpinner.setSelection(mSelectedIndex);
}

이것을 시도해보십시오. 그것은 나를 위해 일했습니다.

Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination);
destSpinner.setSelection(0);
String dest = events.get(pos).getDestination();
int routesPos = routes.indexOf(dest);
destSpinner.setAdapter(aa);
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos);
destSpinner.setSelection(routesPos);

때로는 스피너가 특정 값으로 설정되고 요구 사항에 따라 비활성화 될 수 있으므로 청취자를 설정하지 않을 수도 있습니다.

리스너가 필요하기 때문에 값을 선택하지 않고 setSelection ()로 이어질 수 있습니다.

스피너의 setonitemelectedListener ()가 아래와 같이 사용자 정의 리스너로 설정되어 있는지 확인하십시오.

Spinner가 비활성화 되더라도 아래와 같은 리스너를 설정하여 setSelection () 메소드가 작동하도록해야합니다.

spinnerListener.setOnItemSelectedListener(spinnerListener);
AdapterView.OnItemSelectedListener spinnerListener = new 
AdapterView.OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
      //Your code
    }
}
spinnerListener.setSelection(0);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top