JSON Android应用程序,数据检索问题


JSON Android App, Retrieval of data issue

我的问题是,我有一个包含所有记录的列表视图,当只剩下1条记录时,我试图删除它,该记录在PHP文件中被删除,但在列表视图中,它仍然存在,有人能检查我的代码吗?

这是我填充ListView 的代码

public class MainActivity extends AppCompatActivity {
    String id,name,course;
    JSONArray students = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new JSONParse().execute();
    }
    @Override
    protected void onResume() {
        super.onResume();
        new JSONParse().execute();
    }
    private class JSONParse extends AsyncTask<String,String,JSONObject>{
        private ProgressDialog pDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Getting Data...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
        @Override
        protected JSONObject doInBackground(String... params) {
            JSONParser jParser = new JSONParser();
            JSONObject json = null;
            try {
                json = jParser.getJSONFromUrl("http://192.168.8.102/mymobile/getstudentlist.php");
            }
            catch(Exception e){
                e.printStackTrace();
            }
            return json;
        }
        @Override
        protected void onPostExecute(JSONObject json) {
            super.onPostExecute(json);
            pDialog.dismiss();
            final ArrayList<String> ids = new ArrayList<String>();
            final ArrayList<String> names = new ArrayList<String>();
            final ArrayList<String> courses = new ArrayList<String>();
            try{
                if(!(json.getJSONArray("students").isNull(0))) {
                    students = json.getJSONArray("students");
                    for (int i = 0; i < students.length(); i++) {
                        JSONObject student = students.getJSONObject(i);
                        ids.add(student.getString("id"));
                        names.add(student.getString("name"));
                        courses.add(student.getString("course"));
                    }
                    final ListView listView = (ListView) findViewById(R.id.list);
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>
                            (MainActivity.this, android.R.layout.simple_list_item_1,
                                    android.R.id.text1, names);
                    listView.setAdapter(adapter);
                    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            String stud_id = ids.get(position);
                            String stud_name = names.get(position);
                            String stud_course = courses.get(position);
                            Intent i = new Intent(MainActivity.this, ActivityEditDel.class);
                            i.putExtra("stud_id", stud_id);
                            i.putExtra("stud_name", stud_name);
                            i.putExtra("stud_course", stud_course);
                            i.putExtra("stud_course", stud_course);
                            startActivity(i);
                        }
                    });
                }
            } catch (JSONException e) {
                e.printStackTrace();
            } catch (NullPointerException e){
                e.printStackTrace();
            }
        }
    }

这是我用来检索数据并将其解析为json对象的php文件。

<?php
$database_name = 'dbstudrec';
$con = mysqli_connect('localhost', 'root', '',$database_name);
$query = "SELECT * FROM tblstudent";
$result = mysqli_query($con,$query);
$rec = array();
while($row = mysqli_fetch_assoc($result)){
    $rec['students'][] = $row;
}
echo json_encode($rec);
mysqli_close($con);
?>

我在试图获取jsonaray的代码块上添加了一个try-and-catch,因为当jsonobject为空时,应用程序就会崩溃。[编辑]

编辑和删除活动:

public class ActivityEditDel extends Activity{
    TextView tvId;
    EditText etName, etCourse;
    String strId, strName, strCourse;
    boolean isDeleteAction;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.updatendeleteview);
        tvId = (TextView) findViewById(R.id.tvId);
        etName = (EditText) findViewById(R.id.etName);
        etCourse = (EditText) findViewById(R.id.etCourse);
        Intent i = getIntent();
        strId = i.getStringExtra("stud_id");
        strName = i.getStringExtra("stud_name");
        strCourse = i.getStringExtra("stud_course");
        tvId.setText(strId);
        etName.setText(strName);
        etCourse.setText(strCourse);
        isDeleteAction = false;
    }
    public void doUpdate(View v){
        isDeleteAction=false;
        new JSONParse().execute();
    }
    public void doDelete(View v){
        isDeleteAction = true;
        new JSONParse().execute();
    }
    private class JSONParse  extends AsyncTask<String,String,JSONObject>{
        private ProgressDialog pDialog;
        private Dialog aDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ActivityEditDel.this);
            if(isDeleteAction){
                pDialog.setMessage("Deleting Record...");
            }
            else{
                pDialog.setMessage("Updating Record...");
            }
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
        @Override
        protected JSONObject doInBackground(String... params) {
            JSONParser jParser = new JSONParser();
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("id",strId));
            nameValuePairs.add(new BasicNameValuePair("name", etName.getText().toString()));
            nameValuePairs.add(new BasicNameValuePair("course", etCourse.getText().toString()));
            if(isDeleteAction){
                jParser.runQuery("http://192.168.1.101/mymobile/deleterec.php", nameValuePairs);
            }
            else{
                jParser.runQuery("http://192.168.1.101/mymobile/updaterec.php", nameValuePairs);
            }
            return null;
        }
        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            pDialog.dismiss();
            if (isDeleteAction){
                aDialog = new Dialog(ActivityEditDel.this);
                aDialog.setTitle("Message");
                TextView tv = new TextView(ActivityEditDel.this);
                tv.setText("Delete Successful!");
                tv.setPadding(30, 30, 30, 30);
                aDialog.setContentView(tv);
                aDialog.show();
                aDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        finish();
                    }
                });
            }
            else{
                aDialog = new Dialog(ActivityEditDel.this);
                aDialog.setTitle("Message");
                TextView tv = new TextView(ActivityEditDel.this);
                tv.setText("Update Successful!");
                tv.setPadding(30,30,30,30);
                aDialog.setContentView(tv);
                aDialog.show();
                aDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                    @Override
                    public void onDismiss(DialogInterface dialog) {
                        finish();
                    }
                });
            }
        }
    }
    public void doBack(View v){
        finish();
    }
}

php文件删除:

<?php
$database_name = 'dbstudrec';
$con = mysqli_connect('localhost', 'root', '',$database_name);
$id = $_POST['id'];
$query = "DELETE FROM tblstudent WHERE id = $id";
mysqli_query($con,$query);
mysqli_close($con);
?>

尝试使用

final ListView listView = (ListView) findViewById(R.id.list);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,android.R.id.text1, names);
listView.setAdapter(adapter);
((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();

adapter.notifyDataSetChanged();

在适配器上调用notifyDataSetChanged()或在列表视图中调用invalidateViews()

进一步阅读:如何刷新Android列表视图?