1

私はそのようなものを作りたい:

主な目標は、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;
            }
        });
}
4

1 に答える 1

1

notifyDataSetChanged()スピナーコントロールのメソッドを使用して、アダプターデータの変更を表示できると思います。

于 2015-02-06T08:13:01.850 に答える