Autore Topic: Problema CRUD edit e delete in ListView  (Letto 292 volte)

Offline donpelajo

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Problema CRUD edit e delete in ListView
« il: 23 Gennaio 2015, 16:04:39 CET »
0
Buonasera,

Sto sviluppando un CRUD che prende i dati da un JSON popolato da dati provenienti da un DB mySQL e mi sono bloccato nelle operazioni di delete e di edit. Illustro il problema:

Il file JSON contiene, per ogni oggetto, un id e un nome. Quando vado ad aggiungere nuove voci via app, poniamo che ne abbia già aggiunto delle altre precedentemente, e quindi magari aggiungerò "Casa" con id 10 e "Salotto" con id 11. Quando poi le voglio cancellare o modificare (modificandone il nome), all'interno della ListView queste voci corrisponderanno ad un array che parte da 0, e quindi questi id non combaciano, di conseguenza non posso far fare chiamate esterne in GET proprio perchè gli id sono diversi.

Premesso che ho la mia classe con getter e setter che mi serve per prendere i dati dal JSON e inserirli nella ListView, ho pensato di generare la url da richiedere all'interno del ciclo for che tira fuori gli elementi del JSON per popolare la ListView, ma ho notato che, in quel momento, qualsiasi voce mi prenderà sempre il nome e l'id dell'ultima, quindi nell'esempio pratico, anche selezionando Casa -> 10, mi prenderà Salotto -> 11, e non è quello che voglio.

Dove sbaglio?

Vi allego il codice, così vi potete fare una idea di come sto messo... anche se può sembrare confusionario, sto facendo tutto all'interno della stessa classe (tranne una classe che elabora una generica richiesta GET / POST che comunque non c'entra con l'edit e il delete e quella dei getter e dei setter). Mi potete dare una mano a capire dove sbaglio? Grazie mille.  :D

Codice (Java): [Seleziona]
public class MainActivity extends Activity {

        private Button btnAddNewCategory;
        private TextView txtCategory;
        private ListView spinnerFood;
       
        private ArrayList<Category> categoriesList;
       
        ProgressDialog pDialog;
       
        private String URL_NEW_CATEGORY = "http://nomesito.altervista.org/food/new_category.php";
        private String DELETE_CATEGORY = "http://nomesito.altervista.org/food/delete_article.php";     
        private String URL_CATEGORIES = "http://nomesito.altervista.org/food/get_categories.php";
        private String EDIT_CATEGORY = "http://nomesito.altervista.org/food/edit_category.php";
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                btnAddNewCategory = (Button) findViewById(R.id.btnAddNewCategory);
                txtCategory = (TextView) findViewById(R.id.txtCategory);
                spinnerFood = (ListView) findViewById(R.id.spinFood);
               
                categoriesList = new ArrayList<>();
               
                spinnerFood.setOnItemLongClickListener((new OnItemLongClickListener() {

                        @Override
                        public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) {
                               
                                        DELETE_CATEGORY = "http://nomesito.altervista.org/food/delete_article.php?id=" + arg2;
                                        EDIT_CATEGORY = "http://nomesito.altervista.org/food/edit_category.php?id=" + arg2 + "&name=" + spinnerFood.getItemAtPosition(arg2).toString();
                               
                                                final CharSequence[] items = { "Modifica", "Cancella" };
                                               
                                                new AlertDialog.Builder(MainActivity.this).setTitle("Studente")
                                                                           .setItems(items, new DialogInterface.OnClickListener() {
                                                                                   
                                                                                @Override
                                                                                public void onClick(DialogInterface dialog, int item) {
                                                                                        dialog.dismiss();
                                                                                       
                                                                                        if (item == 0) {
                                                                                                editName();                                    
                                                                                        } else if (item == 1) {
                                                                                                                                                       
                                                                                                new DeleteCategory().execute(DELETE_CATEGORY);
                                                                                                //Toast.makeText(MainActivity.this, "Risposta: -> " + DELETE_CATEGORY, Toast.LENGTH_LONG).show();
                                                                                        }                                                              
                                                                                }

                                                                                private void editName() {
                                                                                       
                                                                                        Toast.makeText(MainActivity.this, EDIT_CATEGORY, Toast.LENGTH_LONG).show();
                                                                                       
                                                                                        LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                                                                        final View formElementsView = inflater.inflate(R.layout.edit_view, null, false);
                                                                                       
                                                                                        final EditText editCategory = (EditText) formElementsView.findViewById(R.id.editCategory);
                                                                                       
                                                                                        new AlertDialog.Builder(MainActivity.this)
                                                                                                       .setView(formElementsView)
                                                                                                       .setTitle("Modifica una categoria")
                                                                                                       .setCancelable(false)
                                                                                                       .setPositiveButton("Conferma la modifica", new DialogInterface.OnClickListener() {
                                                                                                                       
                                                                                                                        @Override
                                                                                                                        public void onClick(DialogInterface dialog, int which) {
                                                                                                                                String newCat = editCategory.getText().toString();
                                                                                                                                //Toast.makeText(MainActivity.this,"Step two -> " + newCat, Toast.LENGTH_LONG).show(); 
                                                                                                                               
                                                                                                                                EDIT_CATEGORY = "http://nomesito.altervista.org/food/edit_category.php?id=" + arg2 + "&name=" + newCat;
                                                                                                                                //Toast.makeText(MainActivity.this, "Final response -> " + EDIT_CATEGORY, Toast.LENGTH_LONG).show();
                                                                                                                               
                                                                                                                                new EditCategory().execute(EDIT_CATEGORY);
                                                                                                                               
                                                                                                                                dialog.cancel();
                                                                                                                        }
                                                                                                                }).show();
                                                                                }                                      
                                                                               
                                                                        }).show();             
                                                                                               
                                                return false;
                                       
                        }
                }));
               
                btnAddNewCategory.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                               
                                if (txtCategory.getText().toString().trim().length() > 0) {
                                        String newCategory = txtCategory.getText().toString();
                                       
                                        new AddNewCategory().execute(newCategory);
                                } else {
                                       
                                        Toast.makeText(MainActivity.this, "Per favore inserisce il nome di una categoria", Toast.LENGTH_SHORT).show();
                                }
                               
                        }
                });
                new GetCategories().execute();
        }

        private class AddNewCategory extends AsyncTask<String, Void, Void> {
               
                boolean isNewCategoryCreated = false;

                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        pDialog = new ProgressDialog(MainActivity.this);
                        pDialog.setMessage("Creo una nuova categoria...");
                        pDialog.setCancelable(false);
                        pDialog.show();
                }

                @Override
                protected Void doInBackground(String... arg) {
                        String newCategory = arg[0];
                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("name", newCategory));
                        ServiceHandler serviceClient = new ServiceHandler();
                        String json = serviceClient.makeServiceCall(URL_NEW_CATEGORY, ServiceHandler.POST, params);
                        Log.d("Crea risposta: ","> " + json);
                       
                        if (json != null) {
                                try {
                                        JSONObject jsonObj = new JSONObject(json);
                                        boolean error = jsonObj.getBoolean("error");
                                       
                                        if (!error) {
                                                isNewCategoryCreated = true;
                                        } else {
                                                Log.e("Errore di creazione di categoria: ", "> " + jsonObj.getString("message"));
                                        }
                                       
                                } catch (JSONException e) {
                                        e.printStackTrace();
                                }
                        } else {
                                Log.e("JSON data", "Non riesco a ricevere i dati dal server!");
                        }
                       
                        return null;
                }

                @Override
                protected void onPostExecute(Void result) {
                        super.onPostExecute(result);
                       
                        if (pDialog.isShowing()) {
                                pDialog.dismiss();
                                onCreate(null); // funziona ma la cosa è da indagare
                        }      
                       
                        if (isNewCategoryCreated) {
                                runOnUiThread(new Runnable() {
                                        @Override
                                        public void run() {
                                                new GetCategories().execute();
                                        }
                                });
                        }
                }              
        }

        private class DeleteCategory extends AsyncTask<String, String, String> {               
               
                @Override
                protected void onPreExecute() {
                        super.onPreExecute();

                        pDialog = new ProgressDialog(MainActivity.this);
                        pDialog.setMessage("Cercando le categorie di cibo...");
                        pDialog.setCancelable(false);
                        pDialog.show();                
                }      

                @Override
                protected String doInBackground(String... uri) {
                       
                        Log.d("JWP", DELETE_CATEGORY);
                       
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response;
                String responseString = null;
                try {
                    response = httpclient.execute(new HttpGet(uri[0]));
                    StatusLine statusLine = response.getStatusLine();
                    if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        response.getEntity().writeTo(out);
                        responseString = out.toString();
                        out.close();
                    } else{
                        //Closes the connection.
                        response.getEntity().getContent().close();
                        throw new IOException(statusLine.getReasonPhrase());
                    }
                } catch (ClientProtocolException e) {
                    //TODO Handle problems..
                } catch (IOException e) {
                    //TODO Handle problems..
                }
                return responseString;
                }

                @Override
                protected void onPostExecute(String result) {
                        super.onPostExecute(result);
                       
                        if (pDialog.isShowing()) {
                                pDialog.dismiss();
                                onCreate(null);
                        }
                }              
        }
       
        private class EditCategory extends AsyncTask<String, String, String> {
               
                @Override
                protected void onPreExecute() {
                        super.onPreExecute();

                        pDialog = new ProgressDialog(MainActivity.this);
                        pDialog.setMessage("Cercando le categorie di cibo...");
                        pDialog.setCancelable(false);
                        pDialog.show();                                
                       
                }

                @Override
                protected String doInBackground(String... uri) {
                        Log.d("JWP", EDIT_CATEGORY);
                       
                HttpClient httpclient = new DefaultHttpClient();
                HttpResponse response;
                String responseString = null;
                try {
                    response = httpclient.execute(new HttpGet(uri[0]));
                    StatusLine statusLine = response.getStatusLine();
                    if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        response.getEntity().writeTo(out);
                        responseString = out.toString();
                        out.close();
                    } else{
                        //Closes the connection.
                        response.getEntity().getContent().close();
                        throw new IOException(statusLine.getReasonPhrase());
                    }
                } catch (ClientProtocolException e) {
                    //TODO Handle problems..
                } catch (IOException e) {
                    //TODO Handle problems..
                }
                return responseString;
                }

                @Override
                protected void onPostExecute(String result) {

                        super.onPostExecute(result);
                       
                        if (pDialog.isShowing()) {
                                pDialog.dismiss();
                                onCreate(null);
                        }                      
                }              
               
        }
       
        private class GetCategories extends AsyncTask<Void, Void, Void> {              
               
                @Override
                protected void onPreExecute() {
                        super.onPreExecute();
                        pDialog = new ProgressDialog(MainActivity.this);
                        pDialog.setMessage("Cercando le categorie di cibo...");
                        pDialog.setCancelable(false);
                        pDialog.show();
                }

                @Override
                protected Void doInBackground(Void... arg0) {
                       
                        ServiceHandler jsonParser = new ServiceHandler();
                        String json = jsonParser.makeServiceCall(URL_CATEGORIES, ServiceHandler.GET);
                        Log.e("Response: ", "> " + json);
                       
                        if (json != null) {
                                try {
                                        JSONObject jsonObj = new JSONObject(json);
                                       
                                        if (jsonObj != null) {
                                                JSONArray categories = jsonObj.getJSONArray("categories");
                                               
                                                for (int i = 0; i < categories.length(); i++) {
                                                        JSONObject catObj = (JSONObject) categories.get(i);
                                                        Category cat = new Category(catObj.getInt("id"),
                                                                        catObj.getString("name"));
                                                        //DELETE_CATEGORY = "http://nomesito.altervista.org/food/delete_article.php?id=" + catObj.getInt("id");
                                                        //EDIT_CATEGORY = "http://nomesito.altervista.org/food/edit_category.php?id=" + catObj.getInt("id") + "&name=" + catObj.getString("name");                                                     
                                                        categoriesList.add(cat);
                                                }
                                        }
                                } catch (JSONException e) {
                                        e.printStackTrace();
                                }
                        } else {
                                Log.e("JSON data", "Non sto ricevendo nulla dal server!");
                        }
                        return null;
                }

                @Override
                protected void onPostExecute(Void result) {
                        super.onPostExecute(result);
                        if (pDialog.isShowing()) {
                                pDialog.dismiss();
                                populateSpinner();                             
                        }
                }
               
        }
       
        private void populateSpinner() {
                List<String> labels = new ArrayList<String>();
               
                txtCategory.setText("");
               
                for (int i = 0; i < categoriesList.size(); i++) {
                        labels.add(categoriesList.get(i).getName());
                }
               
                ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, labels);
               
                spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
               
                spinnerFood.setAdapter(spinnerAdapter);
        }
       
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
               
                int id = item.getItemId();
                if (id == R.id.action_settings) {
                        return true;
                }
                return super.onOptionsItemSelected(item);
        }
}