Autore Topic: Popolare uno spinner da mysql  (Letto 858 volte)

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Popolare uno spinner da mysql
« il: 20 Marzo 2014, 23:40:46 CET »
0
Salve a tutti, sto cercando di convertire un EditText che già prendeva i dati da mysql, in uno spinner che prelevi i dati da mysql, ma non il singolo elemento, ma una lista completa, solo che sono in difficoltà.

Ho iniziato a fare qualche prova, ma il risultato e che non riesco a popolare questo spinner.

Vi posto il codice:

AddPlantActivity:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
 
public class AddPlantActivity extends Activity {
 
    // Progress Dialog
    private ProgressDialog pDialog;
 
    JSONParser jsonParser = new JSONParser();
    EditText inputName;
    //EditText inputUserId;
    Spinner inputUserId;
    EditText inputType;
 
    // url to create new plant
    private static String url_create_plant = "http://192.168.0.8/test/telegea/create_plant.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";

    private JSONArray userList = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_plant);
 
        // Edit Text
        inputName = (EditText) findViewById(R.id.inputName);
        //inputUserId = (EditText) findViewById(R.id.inputUserId);
        inputUserId = (Spinner) findViewById(R.id.inputUserId);
        inputType = (EditText) findViewById(R.id.inputType);

        // Create button
        Button btnCreatePlant = (Button) findViewById(R.id.btnCreatePlant);

        // button click event
        btnCreatePlant.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View view) {

                String name = inputName.getText().toString();
                //String user_id = inputUserId.getText().toString();

                if(name.equals("")) {
                    new AlertDialog.Builder(AddPlantActivity.this)
                            .setTitle(R.string.error)
                            .setMessage(R.string.dialog_name_empty)
                            .setNeutralButton("OK", null)
                            .show();
                }

                /*else if(user_id.equals("")) {
                    new AlertDialog.Builder(AddPlantActivity.this)
                            .setTitle(R.string.error)
                            .setMessage(R.string.dialog_user_empty)
                            .setNeutralButton("OK", null)
                            .show();
                }*/
                else
                    // creating new plant in background thread
                    new CreateNewPlant().execute();
            }
        });
    }
 
    /**
     * Background Async Task to Create new plant
     * */
    class CreateNewPlant extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AddPlantActivity.this);
            pDialog.setMessage("Creating Plant..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Creating plant
         * */
        protected String doInBackground(String... args) {

            String name = inputName.getText().toString();
            //String user_id = inputUserId.getText().toString();
            String type = inputType.getText().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("name", name));
            //params.add(new BasicNameValuePair("user_id", user_id));
            params.add(new BasicNameValuePair("type", type));

            // getting JSON Object
            // Note that create plant url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_plant,
                    "POST", params);

            // check log cat for response
            Log.d("Create Response", json.toString());

            final String[] items = new String[userList.length()];

            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                userList = json.getJSONArray("posts");
                for (int i = 0; i < userList.length(); i++) {
                    JSONObject c = userList.getJSONObject(i);
                    items [i]=c.getString("user_id");
                }

                if (success == 1) {
                    // closing this screen
                    finish();
                } else {
                    // failed to create plant
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            ArrayAdapter<String> adapter = new ArrayAdapter<String>
            (AddPlantActivity.this,android.R.layout.simple_spinner_item, items);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            inputUserId.setAdapter(adapter);

            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }
 
    }
}

Ho commentato per ora le parti che c'erano in precedenza con l'EditText, per sostituirlo con lo Spinner.

Per ora niente da fare, mentre aspetto una risposta di qualcuno di voi proverò comunque a vedere se riesco ad andare avanti e a sbloccare la situazione.

Marco

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Popolare uno spinner da mysql
« Risposta #1 il: 22 Marzo 2014, 00:18:23 CET »
0
Ho parzialmente risolto con la popolazione dello spinner, però non totalmente visto che non quando apro i dettagli dell'utente non ottengo l'utente selezionato corretto.

Per ora sto agendo sull'id, sto lavorando per poter agire sul full_name a livello di php.

Però il problema è che se creo un nuovo impianto e gli do un certo id utente, quando apro quest'impianto appare nella selezione il primo utente della lista.

Vi posto il codice aggiornato sia per l'AddPlant che per l'EditPlant, e anche il Model Users che uso per caricare la lista utenti.

AddPlantActivity:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
 
public class AddPlantActivity extends Activity implements OnItemSelectedListener {

    // Progress Dialog
    private ProgressDialog pDialog;

    JSONParser jsonParser = new JSONParser();
    EditText inputName;
    Spinner inputFullName;
    Spinner inputType;

    private ArrayList<Users> usersList;

    // url to create new plant
    private static String url_create_plant = "http://192.168.0.8/test/telegea/create_plant.php";

    private static String url_all_users = "http://192.168.0.8/test/telegea/get_all_users.php";

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_plant);

        // Edit Text
        inputName = (EditText) findViewById(R.id.inputName);
        inputFullName = (Spinner) findViewById(R.id.inputFullName);
        inputType = (Spinner) findViewById(R.id.inputType);

        // Create button
        Button btnCreatePlant = (Button) findViewById(R.id.btnCreatePlant);

        usersList = new ArrayList<Users>();

        inputFullName.setOnItemSelectedListener(this);

        // button click event
        btnCreatePlant.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                String name = inputName.getText().toString();

                if(name.equals("")) {
                    new AlertDialog.Builder(AddPlantActivity.this)
                            .setTitle(R.string.error)
                            .setMessage(R.string.dialog_name_empty)
                            .setNeutralButton("OK", null)
                            .show();
                }

                else
                    // creating new plant in background thread
                    new CreateNewPlant().execute();
            }
        });
        new GetUsers().execute();
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    }

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

    }

    private class GetUsers extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AddPlantActivity.this);
            pDialog.setMessage("Fetching users..");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            ServiceHandler jsonParser = new ServiceHandler();
            String json = jsonParser.makeServiceCall(url_all_users, ServiceHandler.GET);

            Log.e("Response: ", "> " + json);

            if (json != null) {
                try {
                    JSONObject jsonObj = new JSONObject(json);
                    if (jsonObj != null) {
                        JSONArray users = jsonObj
                                .getJSONArray("users_view");

                        for (int i = 0; i < users.length(); i++) {
                            JSONObject userObj = (JSONObject) users.get(i);
                            Users user = new Users(userObj.getInt("id"),
                                    userObj.getString("id"));
                            usersList.add(user);
                        }
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            } else {
                Log.e("JSON Data", "Didn't receive any data from server!");
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (pDialog.isShowing())
                pDialog.dismiss();
            populateSpinner();
        }

    }

    /**
     * Adding spinner data
     * */
    private void populateSpinner() {
        List<String> labels = new ArrayList<String>();

        for (int i = 0; i < usersList.size(); i++) {
            labels.add(usersList.get(i).getName());
        }

        // Creating adapter for spinner
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, labels);

        // Drop down layout style - list view with radio button
        spinnerAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // attaching data adapter to spinner
        inputFullName.setAdapter(spinnerAdapter);
    }

    /**
     * Background Async Task to Create new plant
     * */
    class CreateNewPlant extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AddPlantActivity.this);
            pDialog.setMessage("Creating Plant..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
 
        /**
         * Creating plant
         * */
        protected String doInBackground(String... args) {

            String name = inputName.getText().toString();
            String full_name = inputFullName.getSelectedItem().toString();
            String type = inputType.getSelectedItem().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("name", name));
            params.add(new BasicNameValuePair("user_id", full_name));
            params.add(new BasicNameValuePair("type", type));

            // getting JSON Object
            // Note that create plant url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_plant,
                    "POST", params);

            // check log cat for response
            Log.d("Create Response", json.toString());

            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // closing this screen
                    finish();
                } else {
                    // failed to create plant
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.dismiss();
        }
 
    }
}

EditPlantFragment:

Codice: [Seleziona]
package com.example.tabstelegeatest;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

import com.actionbarsherlock.app.SherlockFragment;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

public class EditPlantFragment extends SherlockFragment implements AdapterView.OnItemSelectedListener {

    EditText txtName;
    Spinner txtFullName;
    Spinner txtType;
    Button btnSave;
    Button btnDelete;

    String pid;

    // Progress Dialog
    private ProgressDialog pDialog;

    // JSON parser class
    JSONParser jsonParser = new JSONParser();

    // single plant url
    private static final String url_plant_details = "http://192.168.0.8/test/telegea/get_plant_details.php";

    // url to update plant
    private static final String url_update_plant = "http://192.168.0.8/test/telegea/update_plant.php";

    // url to delete plant
    private static final String url_delete_plant = "http://192.168.0.8/test/telegea/delete_plant.php";

    private static String url_all_users = "http://192.168.0.8/test/telegea/get_all_users.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PLANTS = "plants";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_USER_ID = "user_id";
    private static final String TAG_TYPE = "type";

    private ArrayList<Users> usersList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View mainView = inflater.inflate(R.layout.edit_plant, container, false);
        return mainView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // save button
        btnSave = (Button) getView().findViewById(R.id.btnSave);
        btnDelete = (Button) getView().findViewById(R.id.btnDelete);

        // Edit Text
        txtName = (EditText) getView().findViewById(R.id.inputName);
        txtFullName = (Spinner) getView().findViewById(R.id.inputFullName);
        txtType = (Spinner) getView().findViewById(R.id.inputType);

        usersList = new ArrayList<Users>();

        txtFullName.setOnItemSelectedListener(this);

        // getting plant details from intent
        Intent i = getActivity().getIntent();

        // getting plant id from intent
        pid = i.getStringExtra(TAG_PID);

        // Getting complete plant details in background thread
        new GetPlantDetails().execute();
        new GetUsers().execute();

        // save button click event
        btnSave.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // starting background task to update plant
                new SavePlantDetails().execute();
            }
        });

        // Delete button click event
        btnDelete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // deleting plant in background thread
                new DeletePlant().execute();
            }
        });

    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        parent.getItemAtPosition(position);
    }

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

    }

    private class GetUsers extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Fetching users..");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            ServiceHandler jsonParser = new ServiceHandler();
            String json = jsonParser.makeServiceCall(url_all_users, ServiceHandler.GET);

            Log.e("Response: ", "> " + json);

            if (json != null) {
                try {
                    JSONObject jsonObj = new JSONObject(json);
                    if (jsonObj != null) {
                        JSONArray users = jsonObj
                                .getJSONArray("users_view");

                        for (int i = 0; i < users.length(); i++) {
                            JSONObject userObj = (JSONObject) users.get(i);
                            Users user = new Users(userObj.getInt("id"),
                                    userObj.getString("id"));
                            usersList.add(user);
                        }
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            } else {
                Log.e("JSON Data", "Didn't receive any data from server!");
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            if (pDialog.isShowing())
                pDialog.dismiss();
            populateSpinner();
        }

    }

    /**
     * Adding spinner data
     * */
    private void populateSpinner() {
        List<String> labels = new ArrayList<String>();

        for (int i = 0; i < usersList.size(); i++) {
            labels.add(usersList.get(i).getName());
        }

        // Creating adapter for spinner
        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_spinner_item, labels);

        // Drop down layout style - list view with radio button
        spinnerAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // attaching data adapter to spinner
        txtFullName.setAdapter(spinnerAdapter);
    }

    /**
     * Background Async Task to Get complete plant details
     * */
    class GetPlantDetails extends AsyncTask<String, String, JSONObject> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading plant details. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Getting plant details in background thread
         * */
        protected JSONObject doInBackground(String... args) {
            // Check for success tag
            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("id", pid));

                // getting plant details by making HTTP request
                // Note that plant details url will use GET request
                JSONObject json = jsonParser.makeHttpRequest(
                        url_plant_details, "GET", params);

                // check your log for json response
                Log.d("Single Plant Details", json.toString());

                // json success tag
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    // successfully received plant details
                    JSONArray plantObj = json
                            .getJSONArray(TAG_PLANTS); // JSON Array

                    // get first plant object from JSON Array
                    JSONObject plant = plantObj.getJSONObject(0);
                    // plant with this id found

                    return plant;

                } else {
                    // plant with id not found
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(JSONObject plant) {
            // dismiss the dialog once got all details
            pDialog.dismiss();
            // display plant data in EditText
            try {
                txtName.setText(plant.getString(TAG_NAME));
                //txtFullName.getSelectedItem().toString();
                //txtType.getSelectedItem().toString();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Background Async Task to  Save plant Details
     * */
    class SavePlantDetails extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Saving plant ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Saving plant
         * */
        protected String doInBackground(String... args) {

            // getting updated data from EditTexts
            String name = txtName.getText().toString();
            String user_id = txtFullName.getSelectedItem().toString();
            String type = txtType.getSelectedItem().toString();

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair(TAG_PID, pid));
            params.add(new BasicNameValuePair(TAG_NAME, name));
            params.add(new BasicNameValuePair(TAG_USER_ID, user_id));
            params.add(new BasicNameValuePair(TAG_TYPE, type));

            // sending modified data through http request
            // Notice that update plant url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_update_plant,
                    "POST", params);

            Log.d("Update Plant Details", json.toString());

            // check json success tag
            try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // successfully updated
                    Intent i = getActivity().getIntent();
                    // send result code 100 to notify about plant update
                    getActivity().setResult(100, i);
                    getActivity().finish();
                } else {
                    // failed to update plant
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once plant updated
            pDialog.dismiss();
        }
    }

    /*****************************************************************
     * Background Async Task to Delete Plant
     * */
    class DeletePlant extends AsyncTask<String, String, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Deleting Plant...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        /**
         * Deleting plant
         * */
        protected String doInBackground(String... args) {

            // Check for success tag
            int success;
            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("id", pid));

                // getting plant details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(
                        url_delete_plant, "POST", params);

                // check your log for json response
                Log.d("Delete Plant", json.toString());

                // json success tag
                success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    // plant successfully deleted
                    // notify previous activity by sending code 100
                    Intent i = getActivity().getIntent();
                    // send result code 100 to notify about plant deletion
                    getActivity().setResult(100, i);
                    getActivity().finish();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once plant deleted
            pDialog.dismiss();

        }

    }
}

Sull'EditPlant ho anche un problemino che quando apro mi appare la progressbar che non va via e rimane in caricamento.

Users:

Codice: [Seleziona]
package com.example.tabstelegeatest;

public class Users {

    private int id;
    private String name;

    public Users(){}

    public Users(int id, String full_name){
        this.id = id;
        this.name = full_name;
    }

    public void setId(int id){
        this.id = id;
    }

    public void setName(String full_name){
        this.name = full_name;
    }

    public int getId(){
        return this.id;
    }

    public String getName(){
        return this.name;
    }

}

Spero che qualcuno di voi possa aiutarmi a terminare di risolvere il problema.

Marco