之前都是說的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();
}
}
看了我前面的講解的值的回傳應該不難了解。
好啦,總結完了,有什麼需要改進的希望大家能夠指出,互相進步。