Android用Gson解析json数据的刷新问题?

问题描述

下面是我的网络请求代码,用的是Okhttp,把返回的数据通过gson进行解析。
然后把解析出来的mDistributionShopsBean 内的List传给了ListView的适配器来显示。

当我想要刷新数据的时候,再次调用这个方法,然后给适配器notifyDataSetChanged()来刷新,但是我发现并没有刷新数据,好像这里的mDistributionShopsBean 并没有更新?
这是为什么?怎么弄才能让mDistributionShopsBean 刷新。

网络请求及数据解析

private void getData(final int type,int offset,String column,String sort) {
        String url=Constants.DISTRIBUTIONSHOPS+"?offset="+offset+"&limit=10"+"&column="+column+"&sort="+sort;

        OkHttpManager.getAsync(url, new OkHttpManager.DataCallback() {
            @Override
            public void requestFailure(Call call, IOException e) {
                Log.d("BankCardManageActivity", "接口连接失败");
            }

            @Override
            public void requestSuccess(String result) {
                Log.d("DistributionShopsActivi", result);
                //解析数据
                Gson gson = new Gson();
                mDistributionShopsBean = gson.fromJson(result, DistributionShopsBean.class);
                //初始化数据。
                handler.sendEmptyMessage(type);
            }
        });

    }

ListView的适配器。

mCommonAdapter=new CommonAdapter<DistributionShopsBean.DataEntity.ListEntity>(this, mDistributionShopsBean.getData().getList(), R.layout.item_distribution_shops) {
            @Override
            public void convert(ViewHolder holder, DistributionShopsBean.DataEntity.ListEntity listEntity) {
                holder.setImageURI(R.id.id_draweeView_icon, listEntity.getImg());
              
            }
        };

Handler

 private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {         
                case Constants.REFRESHTYPE:
                    mCommonAdapter.notifyDataSetChanged();
                    mIdNormallisviewBgarefreshlayout.endRefreshing();
                    isRefrshing = false;
                    break;
               
            }
        }
    };

DistributionShopsBean

public class DistributionShopsBean {

    /**
     * code : 0
     * data : {"shop_size":2,"earnings":225.55,"list":[{"id":18,"merchant_id":3,"shop_id":3,"team_size":0,"commission":"3.00","img":"","name":"API测试"},{"id":1,"merchant_id":1,"shop_id":1,"team_size":3,"commission":"222.55","img":"2015/11/24/FpVvQPAwOf0SODPRMOd1YZnb22vU.png","name":"微巴人人店DEMO"}]}
     */

    private int code;
    /**
     * shop_size : 2
     * earnings : 225.55
     * list : [{"id":18,"merchant_id":3,"shop_id":3,"team_size":0,"commission":"3.00","img":"","name":"API测试"},{"id":1,"merchant_id":1,"shop_id":1,"team_size":3,"commission":"222.55","img":"2015/11/24/FpVvQPAwOf0SODPRMOd1YZnb22vU.png","name":"微巴人人店DEMO"}]
     */

    private DataEntity data;

    public void setCode(int code) {
        this.code = code;
    }

    public void setData(DataEntity data) {
        this.data = data;
    }

    public int getCode() {
        return code;
    }

    public DataEntity getData() {
        return data;
    }

    public static class DataEntity {
        private int shop_size;
        private double earnings;
        /**
         * id : 18
         * merchant_id : 3
         * shop_id : 3
         * team_size : 0
         * commission : 3.00
         * img :
         * name : API测试
         */

        private List<ListEntity> list;

        public void setShop_size(int shop_size) {
            this.shop_size = shop_size;
        }

        public void setEarnings(double earnings) {
            this.earnings = earnings;
        }

        public void setList(List<ListEntity> list) {
            this.list = list;
        }

        public int getShop_size() {
            return shop_size;
        }

        public double getEarnings() {
            return earnings;
        }

        public List<ListEntity> getList() {
            return list;
        }

        public static class ListEntity {
            private int id;
            private int merchant_id;
            private int shop_id;
            private int team_size;
            private String commission;
            private String img;
            private String name;

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

            public void setMerchant_id(int merchant_id) {
                this.merchant_id = merchant_id;
            }

            public void setShop_id(int shop_id) {
                this.shop_id = shop_id;
            }

            public void setTeam_size(int team_size) {
                this.team_size = team_size;
            }

            public void setCommission(String commission) {
                this.commission = commission;
            }

            public void setImg(String img) {
                this.img = img;
            }

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

            public int getId() {
                return id;
            }

            public int getMerchant_id() {
                return merchant_id;
            }

            public int getShop_id() {
                return shop_id;
            }

            public int getTeam_size() {
                return team_size;
            }

            public String getCommission() {
                return commission;
            }

            public String getImg() {
                return img;
            }

            public String getName() {
                return name;
            }
        }
    }
}
阅读 4k
2 个回答

notifyDataSetChanged更新的前提是数据更新,即传入的List数据有所变化,如果数据集合增加了是可用的,如果是修改了数据集合应该不太适用,因为手机屏幕已经加载部分可能不会重新加载,必须不可视后销毁重新创建后才会是更新的内容,可以使用setadapter,唯一的坏处是会返回到Listview顶部,可以在这之前记录listview的位置,然后再setadapter,再将listview设置到指定位置。而对于下拉刷新来说就不存在了,因为本来就在头部。

试一试,在handler.sendMessage(),并且在Message里面把mDistributionShopsBean传递出去.....然后再handlerMessage获取list。很可能在你的mDistributionShopsBean没有传出去

Message m=new Message();
m.what=...;
m.obj=mDistributionShopsBean;
handler.sendMessage(m);

然后爱hanldeMessage中,

list.addAll(msg.obj);这里需要强转类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题