如何从android中的json feed刷新和加载数据?

时间:2012-03-23 04:45:01

标签: android json

我有一个来自URLjson feed,其中包含20个字段,我会解析所有数据。但是,我需要在显示20个字段后从json feed加载更多数据在listview中。

我创建了一个AsyncTask并在listview中加载了json。这是我的班级

public void onCreate(Bundle savedInstanceState) {
new DoInBackgrd().execute();
}

    private class DoInBackgrd extends AsyncTask<Void, Void, Void> implements
            DialogInterface.OnCancelListener {

        private ProgressDialog processDialog;

        @Override
        protected void onPreExecute() {
            processDialog = ProgressDialog.show(List.this, "",
                    getString(R.string.loading), true);
            processDialog.setCancelable(true);
        }

        public void onCancel(DialogInterface arg0) {
            // TODO Auto-generated method stub

            if (processDialog.isShowing()) {
                processDialog.dismiss();
            }

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub

            Jsonfunctions jParser = new Jsonfunctions();
            JSONObject json = jParser.getJSONFromUrl(url);
            try {
                // Getting Array of Contacts
                results = json.getJSONArray(TAG_RESULTS);

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

                    id = c.getString(TAG_ID);
                    name = c.getString(TAG_NAME);
                    adress = c.getString(TAG_ADRRESS);
                    latitude = c.getString(TAG_LATITUDE);
                    latitudeAry.add(c.getString(TAG_LATITUDE).toString());
                    longitude = c.getString(TAG_lONGITUDE);
                    latitudeAry.add(c.getString(TAG_lONGITUDE).toString());
                    distance = c.getString(TAG_DISTANCE);
                    image = c.getString(TAG_IMAGE);
                    phone = c.getString(TAG_TELEPHONE);
                    telphonenumberAry
                            .add(c.getString(TAG_TELEPHONE).toString());
                    NameAry.add(c.getString(TAG_NAME).toString());

                    resourceAry.add(new ResourceClass(point, id, name, adress,
                            distance, latitude, longitude, phone));
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void unused) {
            if (processDialog.isShowing()) {
                processDialog.dismiss();
            }
            listView.setAdapter(new ASyncAdapter());
            listView.setDividerHeight(2);
            listView.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> arg0, View arg1,
                        int position, long id) {

                    Intent details = new Intent(List.this, Details.class);
                    details.putExtra("position", position + 1);
                    details.putExtra("name", resourceAry.get(position)
                            .getName());
                    details.putExtra("adress", resourceAry.get(position)
                            .getAdress());
                    details.putExtra("phone", resourceAry.get(position)
                            .getTelephone());
                    details.putExtra("latitudes", latitude);
                    details.putExtra("longitudes", longitude);
                    startActivity(details);

                }
            });
        }
    }

提前致谢

1 个答案:

答案 0 :(得分:3)

我刚刚完成了类似的要求(issue faced on is specified in

因此,我希望能为您提供适当的解决方案,为您节省时间。

如果我没有错,你需要在下一个20(即21 - 40)个字段中填入相同的ListView,以响应服务器api。

在这种情况下,你需要一次又一次地调用服务器api,因为你需要一个事件。假设您添加一个“下一步”按钮,然后在其单击中查看接下来的20个字段(21 - 40)。

目前,在“DoInBackgrd”的ur代码中,每次需要将新记录/字段绑定到ListView时,都会绑定/设置Adapter(ASyncAdapter)。这不是一个好习惯,它也不会在listView中刷新新分配的适配器的字段。

因此你应该:

  1. 只需从JSon检索/解析新文件并将其设置在适配器中。适配器将通知listView有关数据更改的信息,listView将刷新其视图。
  2. 考虑到'ASyncAdapter'是实现ArrayAdapter的自定义适配器,只需添加以下内容(从餐厅更改变量类型,根据您的要求)方法。

    public void reSet(ArrayList<Resturant> resturantsCache) {
               //This will clear your current fields/records in adpter
       clear();
    
               //This will new fields/records in adpter from provided resturantsCache ArrayList.
       for (Resturant resturant : resturantsCache) {
            add(resturant);
        }
    }
    
  3. 希望您能够在提供的方法中替换变量类型并根据您的要求使用它。如果您需要更多帮助,请提供ASyncAdapter代码。

    感谢。