[Android] Spinner 또는 ListView에 Adapter 지정 후 바로 setSelection 호출 제대로 하기

제목도 참 길어 거시기 합니다. 안드로이드에서 Spinner나 ListView에 항목에 대한 목록을 지정하기 위해서는 Adapter 객체를 생성 및 구성해서 setAdapter 함수를 호출하여 지정합니다. 이렇게 지정하고 난 뒤에 바로 n번째 항목을 선택하도록 setSelection(n-1)과 같은 함수를 호출하게 됩니다. 예를 들어 아래와 같은 코드처럼 말입니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

int n = ...;

...

spRi.setSelection(n-1);

그러나 이렇게 하면 n번째 항목은 선택되지 않고 항상 첫번째 항목이 선택되어 있습니다. 사용자 인터페이스(UI)에 대한 표현은 다른 연산보다 가장 나중에 처리되는 OS 정책 때문인데요. 이럴때는 아래와 같은 코드로 대신해야 합니다.

Spinner spRi = (Spinner)findViewById(R.id.spRi);
ArrayAdapter adp = new ArrayAdapter( ... );

...

spRi.setAdapter(adpr);

new Handler().postDelayed(new Runnable() {        
    public void run() {
        int n = ...;

        ...

        spRi.setSelection(n-1);
    }
}, 100);

즉, UI의 표현이 될때까지 기다렸다가 n-1 번째 항목을 선택하라는 것인데요.. 기다린다는 것이 100ms라는 애매한 시간으로 지정했다는 것이 걸리지만 잘 작동합니다. 않되면 이 애매한 시간을 더 늘려주세요. 개인적으로 Delay나 Sleep와 같은 기능을 하는 함수 호출을 싫어하지만… 근데 어디선가 지금 바로 UI를 업데이트 하라는 함수를 본 것 같은데 기억이 않난단 말입니다. 메모를 해 뒀어야 했는데 말입니다.

[논문] 지적정보 서비스 모바일 애플리케이션 개발

2012년도에 작성된 논문입니다. 모바일 기기를 이용하여 지적업무를 효과적으로 처리할 수 있는 애플리케이션 개발에 대한 글로써 모바일 애플리케이션은 BlackPoint-Xr을 이용하여 구현하였습니다.

“본 연구에서는 지적재조사사업을 비롯하여 다양한 지적업무를 효과적으로 추진하기 위해 필요한 지적정보를 서비스하기 위한 모바일 애플리케이션 시스템을 개발하였다. 먼저 스마트폰이나 태블릿 PC 등의 모바일 기반 지적정보시스템을 구현하기 위해 BlackPoint-Xr을 공간 클라이언트 엔진으로 선정하였다. 모바일 지적정보 시스템은 항공사진, 지적도, 행정구역도, DEM 등의 공간정보를 기반으로 GPS를 통한 위치 찾기, 주소와 지번을 통한 필지 검색 그리고 필지에 대한 주소, 지목, 공시지가 등의 토지대장 정보를 확인할 수 있는 기능이 포함되어 있다. 특히 본 연구에서는 건설공사나 토지정비사업 등에 활용하기 위해 필지에 대한 거리, 면적, 경사 그리고 횡단면도 등을 분석할 수 있는 기능도 개발하였다. 본 시스템은 현장에서 다양한 지적정보를 사용자들에게 서비스해 줌으로서 지적업무와 건설공사 등을 효과적으로 지원할 수 있고 디지털 지적정보 분야에도 응용될 수 있을 것으로 판단된다.”

논문에 대한 전체 내용은 아래의 URL을 통해 다운로드 받아 볼 수 있습니다.