列表视图和异步任务不通信删除项目?

时间:2015-04-21 12:42:27

标签: java android android-listview android-asynctask

我有一个简单的课程。它从我的localhost加载数据并使用android:id / list填充在listview中。

当我点击某个项目时,我设置了一个onclick监听器来调用我的删除异步任务。

我的profileList.remove(位置),工作我似乎无法获得notifyDataSetChanged();工作的方法,不知道放在哪里?

最后,我不确定,但我不认为我的类正在引用我要删除的项目的位置并将其与我的数据库匹配?我一直在我的LOG中找到“success = 0 no profile”。

任何想法?我只想刷新我的count / listview并删除我的项目。

类别:

 public class ViewAllLocations extends ListActivity {

    String id;

    // Progress Dialog
    private ProgressDialog pDialog;

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

    ArrayList<HashMap<String, String>> profileList;
    SimpleAdapter adapter;
    // url to get all products list
    private static String url_all_profile = "http://MYIP:8888/android_connect/get_all_location.php";
    // url to delete product
    private static final String url_delete_profile = "http://MYIP:8888/android_connect/delete_location.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_LOCATION = "Location";
    private static final String TAG_ID = "id";
    private static final String TAG_LATITUDE = "latitude";
    private static final String TAG_LONGITUDE = "longitude";


    // products JSONArray
    JSONArray userprofile = null;

    TextView locationCount;
    int count = 0;
    Button deleteLocation;
    ListView lo;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_all_locations);
        // Hashmap for ListView
        profileList = new ArrayList<HashMap<String, String>>();

        deleteLocation = (Button) findViewById(R.id.deleteLocation);
        locationCount = (TextView) findViewById(R.id.locationCount);
        lo = (ListView) findViewById(android.R.id.list);

        //setup adapter first //now no items, after getting items (LoadAllLocations) will update it
        adapter = new SimpleAdapter(
                ViewAllLocations.this, profileList,
                R.layout.locationitem, new String[]{TAG_ID,
                TAG_LATITUDE, TAG_LONGITUDE},
                new int[]{R.id.id, R.id.latitude, R.id.longitude});

        // updating listview
        setListAdapter(adapter);

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

        deleteLocation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        // getting product details from intent
        Intent i = getIntent();

        // getting product id (pid) from intent
        id = i.getStringExtra(TAG_ID);

        // Get listview
        ListView lo = getListView();

        lo.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                new DeleteLocation(position).execute();
                Map<String, String> item = profileList.get(position);
                String selectedItemId = item.get(TAG_ID);
                new DeleteLocation(position).execute(selectedItemId);


            }
        });


    }


    /**
     * **************************************************************
     * Background Async Task to Delete Product
     */
    class DeleteLocation extends AsyncTask<String, String, Integer> {

        int deleteItemPosition;

        public DeleteLocation(int position) {
// TODO Auto-generated constructor stub
            this.deleteItemPosition = position;
        }

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

        /**
         * Deleting product
         */
        protected Integer doInBackground(String... args) {

            String selectedId = args[0];

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

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

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

                // json success tag
                success = json.getInt(TAG_SUCCESS);
                //if (success == 1) {
                // product successfully deleted
                // notify previous activity by sending code 100
                // Intent i = getIntent();
                // send result code 100 to notify about product deletion
                //setResult(100, i);

                //you cant update UI on worker thread, it must be done on UI thread
                // Toast.makeText(getApplicationContext(), "Location Deleted",
                // Toast.LENGTH_SHORT).show();
                //finish();
                // }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return success;
        }


        /**
         * After completing background task Dismiss the progress dialog
         * *
         */
        protected void onPostExecute(Integer result) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();
            if (result == 1) {
                    //success
                   //delete from list and update listview
                profileList.remove(deleteItemPosition);
                adapter.notifyDataSetChanged();
            } else {
            //failed
            }

        }

    }

    /**
     * Background Async Task to Load all product by making HTTP Request
     */
    class LoadAllLocation extends AsyncTask<String, String, Integer> {
        int success;

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

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

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

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

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

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

                        // Storing each json item in variable
                        String id = c.getString(TAG_ID);
                        String latitude = c.getString(TAG_LATITUDE);
                        String longitude = c.getString(TAG_LONGITUDE);


                        // 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_LATITUDE, latitude);
                        map.put(TAG_LONGITUDE, longitude);


                        // adding HashList to ArrayList
                        profileList.add(map);
                    }
                } else {
                    // no products found
                    // Launch Add New product Activity
                    //Intent i = new Intent(getApplicationContext(),
                    // UserLocation.class);
                    // Closing all previous activities
                    // i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    // startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return success;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * *
         */
        protected void onPostExecute(Integer result) {
            // dismiss the dialog after getting all products
            pDialog.dismiss();
            locationCount.setText("" + profileList.size());
            if (result == 1) {
            //success
            //update adapter items
                adapter.notifyDataSetChanged();
            } else {
            //failed
            //launch activity here
            }


        }

    }

PHP:

<?php

/*
 * Following code will delete a profile from table
 * A product is identified by profile id (id)
 */

// array for JSON response
$response = array();

// check for required fields
if (isset($_POST['id'])) {
    $id = $_POST['id'];

    // include db connect class
    require_once __DIR__ . '/db_connect.php';

    // connecting to db
    $db = new DB_CONNECT();

    // mysql update row with matched pid
    $result = mysql_query("DELETE FROM Location WHERE id = $id");

    // check if row deleted or not
    if (mysql_affected_rows() > 0) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "Profile successfully deleted";

        // echoing JSON response
        echo json_encode($response);
    } else {
        // no product found
        $response["success"] = 0;
        $response["message"] = "No Profile found";

        // echo no users JSON
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";

    // echoing JSON response
    echo json_encode($response);
}
?>

0 个答案:

没有答案