私はそのようなものを作りたい:
主な目標は、Webサービスからロードされたスピナーコンテンツを表示することです。
ユーザーがスピナーをクリックすると、アダプターに「loading...」などのテキストが表示されます。そして、最終的にロードされると、スピナーの既存のアダプターをロードされたコンテンツに置き換える必要があります。
私は何をしましたか:私はそれのためにスピナーとonTouchListenerを作りました。リスナーで、WebサービスからデータをダウンロードするasyncTaskを起動しています。asyncTaskのonPostExecuteで、実際にスピナーアダプターを置き換えて、spinner.performClick()を実行しようとしています。しかし実際には、ユーザーには2つのアダプターが同時に表示されています。最初のアダプター(「読み込み中...」)と、spinner.performClick()によって表示された新しいアダプターです。
最初のタスクを実行する方法や、アダプターを1つだけ表示する方法について、より良いアイデアはありますか?
これが私が使用するいくつかのコードです:
private class CountryRegionCity extends AsyncTask<String, Void, JSONArray> {
protected JSONArray doInBackground(String... params) {
// Getting contents from web service
{...}
return someJSONArray;
}
protected void onPostExecute (JSONArray jsonArray) {
ArrayList<String> countryNames = new ArrayList<String>();
//Filling here countryNames based on jsonArray
{...}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, countryNames);
mCountrySpinner.setAdapter(adapter);
mCountrySpinner.performClick();
}
}
public View onCreateDialogView() {
ArrayAdapter<String> countryArrayAdapter=new ArrayAdapter<String> (context(), android.R.layout.simple_spinner_item, new String[] {"Loading..."});
mCountrySpinner.setAdapter(countryArrayAdapter);
mCountrySpinner.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
CountryRegionCity getCountries = new CountryRegionCity();
getCountries.execute("countries");
return false;
}
});
}