ListView通过Volley进行网络数据的请求更新

之前都是说的Listview的假数据的适配,今天,通过访问服务器数据来进行一个实时的更新的操作。

将自己的心得体会进行一个梳理整理吧:

还是老规矩,先放我们实现的效果图吧,让大家最起码进行一个直观的了解:


首先,实现网络数据的请求,我们要有一个model的实体类,方便我们对数据的get以及set。这边做的是一个地址方面的管理,所以Address.class如下:

public class Address {
    //地址ID
    private String addressId;
    //收货人
    private String recipient;
    //联系方式
    private String mobile;
    //所在城市
    private String city;
    //详细地址
    private String address;
    //邮政编码
    private String postalcode;

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPostalcode() {
        return postalcode;
    }

    public void setPostalcode(String postalcode) {
        this.postalcode = postalcode;
    }

    public String getAddressId() {
        return addressId;
    }

    public void setAddressId(String addressId) {
        this.addressId = addressId;
    }
}

然后之前的listview的适配以及item的布局等我们已经说过了,这边只是说一下网络数据的请求交互吧。

private ListView mListView;
private MyAddressAdapter addressAdapter;
private List<Address> addresses;
声明我们需要的,listview不必多说,适配的adapter也定义过,最重要的就是我们的List<Address>这个list。里面存放我们网络请求的数据。

onCreate()中的代码如下:

/**
 * listview的处理适配
 * */
mListView = (PullToRefreshSwipeMenuListView) findViewById(R.id.list_address);
addresses = getMessage();
其中getMessage是对数据的更新以及获取:

/**
 * listview的信息的更新设置
 */
private List<Address> getMessage() {
    final List<Address> address_list = new ArrayList<Address>();
    StringRequest address_find = new StringRequest(Request.Method.POST,
            Onn.url + "xxxxxx",
            new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    // TODO Auto-generated method stub
                    Log.d("TAG", response);
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        String status = jsonObject.getString("status");
                        if (status.equals("true")) {
                            JSONArray jsonArray = jsonObject.getJSONArray("obj");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject temp = (JSONObject) jsonArray.get(i);
                                Address item = new Address();
                                item.setRecipient(temp.getString("recipient"));
                                item.setMobile(temp.getString("mobile"));
                                item.setAddress(temp.getString("address"));
                                item.setAddressId(addressId);
                                address_list.add(item);
                            }
                            addressAdapter = new MyAddressAdapter(getApplicationContext(), address_list);
                            mListView.setAdapter(addressAdapter);
                            addressAdapter.notifyDataSetChanged();
                        } else if (status.equals("false")) {
                           
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO Auto-generated method stub
            Log.e("TAGError", "请求失败", error);
        }
    }) {
        @Override
        protected Map<String, String> getParams()
                throws AuthFailureError {
            Map<String, String> map = new HashMap<String, String>();
            map.put("xxx", xxxx);
            return map;
        }
    };
    MyApplication.getHttpQueue().add(address_find);
    return address_list;
}

这个Volley进行了一点点的封装,大家使用的时候不能直接照搬啦。

解释一下:这里最重要的就是我们的对返回进行json解析的时候,解析status为true时,返回的json数据是数组形式的,每个数组则是我们的一个地址的详细信息。

我们解析的时候,也是利用for循环对json数组进行解析,数组的第一个则是我们的第一条地址的详细信息,然后通过我们声明的Address的实体类来进行set。

将解析的json数据,分别set到我们的address的实体类的对应的属性上。然后我们在getMessage中声明的address_list则是存放我们每一组数据,也就是每一组地址。将解析的每一组地址信息,一次add到我们的address_list的list中。而且作为返回值返回。return回来,在将address_list赋给我们定义的addresses这个list。

这样,我们就实现的数据的绑定。

还有:add到我们指定的list以后,我们要对这个list继续进行适配,并且notifyData...这样,我们的listview就可以显示网络请求的数据,并且实时更新显示我们的数据啦。

接下来最后粘贴一部分adapter方面的代码吧:

public class MyAddressAdapter extends BaseAdapter {

    private Context context;
    private List<Address> address_list;

    public MyAddressAdapter(Context context, List<Address> address) {
        this.context = context;
        this.address_list = address;
    }

    @Override
    public int getCount() {
        return address_list.size();
    }

    @Override
    public Object getItem(int position) {
        return address_list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View contentView, ViewGroup arg2) {
        contentView = LayoutInflater.from(context).inflate(R.layout.list_address_item, null);
//        contentView = LayoutInflater.from(context).inflate(R.layout.list_address_item, null);
        TextView text_name = (TextView) contentView.findViewById(R.id.text_name);
        TextView text_phone = (TextView) contentView.findViewById(R.id.text_phone);
        TextView text_address = (TextView) contentView.findViewById(R.id.text_address);
        Address address = address_list.get(position);
        text_name.setText(address.getRecipient());
        text_phone.setText(address.getMobile());
        text_address.setText(address.getAddress());
        return contentView;
    }

}

这个地方就是我们在对应的位置,将我们的每个item的获取到的数据set到我们的listview的item上。

这样,我们的listview通过volley进行网络请求并且显示就实现了。


大家可能看到我顶部的添加地址的按钮了。这个就是利用之前说过的值的回传。也就是用到我们的startActivityForResult。

给出一些代码大家参考下吧:(本人也就做个记录,自己翻过来能看懂就好啦,不过我也会尽量的细致的讲解)

/**
 * 添加收货地址
 * */
case R.id.toolbar_add:
    startActivityForResult(new Intent(this, AddAddressActivity.class), 0x6c);
    break;

/**
 * 添加地址信息返回请求刷新
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 0x6c && resultCode == 1520) {
        addresses = getMessage();
    }
    super.onActivityResult(requestCode, resultCode, data);
}

其实很简单,主要还是我们的getMessage。

 try {
        JSONObject jsonObject = new JSONObject(response);
        String status = jsonObject.getString("status");
        if (status.equals("true")) {
            /**
             * 新增成功finish,并且回传给MyAddressActivity
             * */
            Intent intent = new Intent();
            intent.putExtra("status", "true");
            setResult(1520, intent);
            finish();
        } else if (status.equals("false")) {

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

看了我前面的讲解的值的回传应该不难理解。

好啦,总结完了,有什么需要改进的希望大家能够指出,互相进步。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值