簡體   English   中英

在spinner for android中看不到setOnItemSelectedListener

[英]setOnItemSelectedListener is not seen in spinner for android

請問您能幫我找到以下代碼的問題! 當旋轉器中的項目選中時,沒有任何反應

即:沒有看到spinner.setOnItemSelectedListener的主體!

代碼:

 package com.example.spinner;


 import java.util.ArrayList;
 import java.util.List; 
 import org.json.JSONArray;
 import org.json.JSONObject;
 import android.os.Bundle;
 import android.app.Activity;
 import android.util.Log; 
 import android.view.View;
   import android.widget.AdapterView;
   import android.widget.ArrayAdapter;
   import android.widget.Spinner;
   import android.widget.Toast;
   import android.widget.AdapterView.OnItemSelectedListener;

   import java.util.HashMap; 
   import org.apache.http.NameValuePair; 
   import org.json.JSONException; 


   import android.annotation.SuppressLint; 
   import android.content.Intent;
   import android.os.AsyncTask;  
   public class MainActivity extends Activity {


        // Creating JSON Parser object
        JSONParser jParser = new JSONParser();

        ArrayList<HashMap<String, String>> productsList;


        // url to get all products list
        private static String url_all_products = "http://10.0.2.2/RPM-connect/get_all_patients.php";

        // JSON Node names
        private static final String TAG_SUCCESS = "success";
        private static final String TAG_DOCTOR = "products";

        private static final String TAG_ID = "id";
        private static final String TAG_F_NAME = "F_name";
        private static final String TAG_S_NAME = "S_name";
        private static final String TAG_L_NAME = "L_name"; 

        // products JSONArray
        JSONArray doctor = null;

        ArrayList<String> spinnerArray ;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            // Hashmap for ListView
            productsList = new ArrayList<HashMap<String, String>>();

            spinnerArray = new ArrayList<String>();

            // Loading products in Background Thread
            new LoadAllProducts().execute();


              Spinner spinner = new Spinner(this);
                              //ArrayAdapter <HashMap<String, String>> spinnerArrayAdapter = new ArrayAdapter<HashMap<String, String>>(

              ArrayAdapter <String> spinnerArrayAdapter = new ArrayAdapter <String >(
                        this, android.R.layout.simple_spinner_item,  spinnerArray );
                spinnerArrayAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );

                spinner = (Spinner) findViewById( R.id.spinner1 );
                spinner.setAdapter(spinnerArrayAdapter);
                spinner.setOnItemSelectedListener(new OnItemSelectedListener(){

                    @Override
                    public void onItemSelected(AdapterView<?> arg0,
                            View arg1, int arg2, long arg3) {


                        Toast.makeText(MainActivity.this, "You have selected : "  , 
                                Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) {
                        // TODO Auto-generated method stub

                    }

                } );
            }




        // Response from Edit Product Activity
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            // if result code 100
            if (resultCode == 100) { 
                Intent intent = getIntent();
                finish();
                startActivity(intent);
            }

        }

        /**
         * Background Async Task to Load all product by making HTTP Request
         * */
        @SuppressLint("NewApi")
        class LoadAllProducts extends AsyncTask<String, String, String> {

            /**
             * getting All products from url
             * */
            protected String doInBackground(String... args) {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                // getting JSON string from URL
                JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

                // Check your log cat for JSON reponse
                Log.d("All Products: ", json.toString());

                try {
                    // Checking for SUCCESS TAG
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // products found
                        // Getting Array of Products
                        doctor = json.getJSONArray(TAG_DOCTOR);



                        // looping through All Products
                        for (int i = 0; i < doctor.length(); i++) {
                            JSONObject c = doctor.getJSONObject(i);


                            // Storing each json item in variable
                            String ID = c.getString(TAG_ID);
                            String F_name = c.getString(TAG_F_NAME);
                            String S_name = c.getString(TAG_S_NAME);
                            String L_name = c.getString(TAG_L_NAME);



                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<String, String>();

                            // adding each child node to HashMap key => value
                            map.put(TAG_ID, ID);
                            map.put(TAG_F_NAME, F_name);
                            map.put(TAG_S_NAME, S_name);
                            map.put(TAG_L_NAME, L_name);



                            // adding HashList to ArrayList
                            productsList.add(map);


                            Log.d("Before temp", productsList.toString());

                            spinnerArray.add(F_name + " " +  L_name);
                            // temp[i]=  F_name+" "+L_name ; 
                            Log.d("TT",spinnerArray.get(i) );
                        }



                    } else {
                        // no products found
                        // Launch Add New product Activity
                        Intent i = new Intent(getApplicationContext(),
                                MainActivity.class);
                        // Closing all previous activities
                        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(i);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }


        }


        } 

完成將項目加載到AsyncTask內的SpinnerAdapter ,您需要告訴Adapter刷新自己以加載新值。

這可以通過調用: spinnerArrayAdapter.notifyDataSetChanged()來完成。

因為AsyncTask正在另一個線程上運行,所以您需要實現

@Override
public void onPostExecute(String result) {
    spinnerArrayAdapter.notifyDataSetChanged()
}

並在其中調用spinnerArrayAdapter.notifyDataSetChanged() ,如上所示。 onPostExecuteonPreExecute在主線程上運行,因此可以在UI線程上更改Views

在設置適配器之前,可能無法從AsyncTask填充ArrayList AsyncTask實現onPostExecute()並在那里調用適配器上的notifyDataSetChanged() 此外,您創建一個新的Spinner然后使用xml中存在的Spinner

 Spinner spinner = new Spinner(this);

這不是必需的。 只需像這樣聲明你的Spinner

public class MainActivity extends Activity {
 Spinner spinner;

然后像以后一樣從xml初始化它

spinner = (Spinner) findViewById( R.id.spinner1 );

notifyDataSetChanged()文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM