天天看點

ListView通過Volley進行網絡資料的請求更新

之前都是說的Listview的假資料的适配,今天,通過通路伺服器資料來進行一個實時的更新的操作。

将自己的心得體會進行一個梳理整理吧:

還是老規矩,先放我們實作的效果圖吧,讓大家最起碼進行一個直覺的了解:

ListView通過Volley進行網絡資料的請求更新

首先,實作網絡資料的請求,我們要有一個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();
    }
}      

看了我前面的講解的值的回傳應該不難了解。

好啦,總結完了,有什麼需要改進的希望大家能夠指出,互相進步。