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

    xiaoxiao2022-06-30  51

    之前都是说的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(); } }

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

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

    转载请注明原文地址: https://ju.6miu.com/read-1125779.html

    最新回复(0)