2012-04-17 2 views
0

웹 서비스의 데이터로 채워 져야하는 Android 액티비티 클래스에 몇 개의 스피너가 있습니다. 이미 웹 서비스 호출을 호출하는 메소드를 설정했습니다. 웹 서비스가 데이터를 반환하고 파싱되면 각 데이터를 내 클래스의 ArrayList 멤버로 채 웁니다. 문제는 특정 회 전자를 선택하는 사용자에게만 이러한 호출을 호출하는 방법을 모르겠다는 것입니다. 예를 들어, 나는 countrySpinner을 결합하려면 다음 코드를 사용합니다Spinner를 클릭했을 때만 웹 서비스에 대한 비동기 호출로 채 웁니다.

countrySpinner = (Spinner) findViewById(R.id.spinner_country); 

    List<String> list= new ArrayList<String>(); 

    list.add("All"); // <-- initial/default content 

    countryAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); 
    countryAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    countrySpinner.setAdapter(countryAdapter); 

기본값은 그 웹 서비스의 기본 동작이기 때문에 괜찮하는 "모든"입니다. 그러나 사용자가 회 전자를 터치하면 callSpinnerWS() 메서드를 호출 한 다음 countryAdapter 멤버를 수정하여 countryAdapter.clear()으로 내 목록을 추가 한 다음 다른 arraylist를 통해 항목을 추가하도록 반복하여 데이터를 다시 채 웁니다.

어디서 웹 서비스에 전화를 걸겠습니까? 이것을 달성하기위한 적절한 바인딩 이벤트는 무엇입니까?

답변

1

AsyncTask를 사용하여 doInBackground 안에 webservice 코드를 넣고 목록 요소 컬렉션에 대한 참조를 반환해야합니다. 그러면 어댑터 컬렉션을 지우고 다시 채울 onPostExecute로 반환됩니다. 실제로 worker thread를 사용하는 것은 ANR (android not responding) 예외를 피하기 위해 필수적입니다. onPreExecute()에서 진행 대화 상자를 표시하고 onPostExecute에서 닫을 수 있습니다.

호출 AsyncTask execute는 회 전자 클릭 리스너에 배치해야합니다. 주어진 회 전자를 참조하거나 어댑터의 참조를 사용하여 AsyncTask의 인스턴스를 초기화 할 수 있습니다.

관련 문제