【问题标题】:Spinner is not displaying items list in Android using AsyncTaskSpinner 未使用 AsyncTask 在 Android 中显示项目列表
【发布时间】:2012-05-17 06:26:43
【问题描述】:

我有一个活动,在 AsyncTask 的帮助下,我使用 Spinner 从 WebService 调用中填充它。我的问题是,在 logcat 中,我可以看到所有 ArrayAdapter<String> 项目,但是当我将此适配器提供给我的 Spinner 时,它不显示下拉列表项目。 这是我的代码 sn-p:

    public static ArrayAdapter<String> adapter;
    Spinner spnrCourseType;
    spnrCourseType.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                new DownloadCourseTypesList().execute(training_id);
                return true;
            }
        });

        spnrCourseType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                ting("You Selected : " + adapter.getItem(arg2));
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });
    /** Thread AsyncTask Class */
    private class DownloadCourseTypesList extends AsyncTask<String,Void,ArrayList<String>> {

        ProgressDialog progressDialog = new ProgressDialog(CorporateTrainingInquiryActivity.this);
        protected void onPreExecute(){
            actionBar.setProgressBarVisibility(View.VISIBLE);
            progressDialog.setTitle("Course Types Loading..");
            progressDialog.setMessage("Please Wait..");
            progressDialog.show();  
        }

        protected ArrayList<String> doInBackground(String... params) {          

            trainingList = new TrainingList(params[0]);
            ArrayList<String> values = trainingList.getTrainingList();    
//          adapter = new ArrayAdapter<String>(CorporateTrainingInquiryActivity.this,android.R.layout.simple_spinner_item,values);

            return values;
        }

        protected void onPostExecute(ArrayList<String> values) {
            actionBar.setProgressBarVisibility(View.GONE);
            adapter = new ArrayAdapter<String>(CorporateTrainingInquiryActivity.this,android.R.layout.simple_spinner_item,values);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            adapter.insert("Select Course Type",0);
            spnrCourseType.setAdapter(adapter);

            for(int i=0;i<adapter.getCount();i++){
                System.out.println("Item in adapter at position : " + i + adapter.getItem(i));
            }

            adapter.notifyDataSetChanged();
            if(progressDialog.isShowing()){
                progressDialog.dismiss();
            }
        }      
    }

当我执行上述代码时,ProgressDialog 变得可见,并且只有第一项,即“选择课程类型”在 Spinner 本身上可见,但在下拉列表项中不可见。关于它的任何线索。我从昨天开始就陷入了困境:(

【问题讨论】:

    标签: android android-asynctask spinner android-arrayadapter


    【解决方案1】:

    这段代码:-

        spnrCourseType.setOnTouchListener(new OnTouchListener() {
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                new DownloadCourseTypesList().execute(training_id);
                return true;
            }
        });
    

    可能会导致某种竞争条件,当您按下微调器时,您的任务会被执行,但它可能无法足够快地填充微调器以让您看到结果。

    我建议将此代码移至其他地方,例如 onCreate 方法或等效方法。

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
    
        new DownloadCourseTypesList().execute(training_id);
    }
    

    希望对您有所帮助。

    【讨论】:

    • 是的,伙计,它现在可以工作了。但是我的代码有什么问题。它出什么问题了?谢谢你的回答。
    • 当你触摸微调器时,你会触发 DownloadCourseTypesList().execute(training_id);这需要一些时间来加载,并且微调器不会自行刷新,我注意到您确实调用了 onNotifyDatasetChanged() 但我不确定它为什么不起作用
    • 是的,实际上我尝试从不同数量的地方调用 notifyDataSetChanged() 方法。有一次,所有项目都可用,但有重复..
    猜你喜欢
    • 2015-04-03
    • 2017-05-31
    • 1970-01-01
    • 2012-05-29
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多