您的位置:首页 > 理论基础 > 计算机网络

android 网络获取json并且显示(2)

2015-04-10 16:40 253 查看
1.将要的取得的json数据格式如下:



我们封装之前的类用google提供的JSONArray和JSONObject类对json字符串进行解析。

对于姚明显示每一条数据,我们封装了一个类如下:

public class Message {
private String msg = null,msgId = null,phone_md5 = null;

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public String getMsgId() {
return msgId;
}

public void setMsgId(String msgId) {
this.msgId = msgId;
}

public String getPhone_md5() {
return phone_md5;
}

public void setPhone_md5(String phone_md5) {
this.phone_md5 = phone_md5;
}

public Message(String msgId, String msg, String phone_md5) {
this.msg = msg;
this.msgId = msgId;
this.phone_md5 = phone_md5;
}

}


这个类简单封装了将要显示的消息。

2.我们要实现把json字符串的数据存进有Message类list中。具体实现如下:

public class Timeline {
public Timeline(String phone_md5,String token,int page,int perpage,
final SuccessCallback successCallback,final Failcallback failcallback){
new NetConnection(Config.SERVER_HTTP, HttpMethod.GET, new NetConnection.SuccessCallback() {
@Override
public void onSuccess(String result) {
// TODO Auto-generated method stub
try {
JSONObject jsonObj = new JSONObject(result);
System.out.println(jsonObj.getInt(Config.KEY_STATUS)+"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
switch (jsonObj.getInt(Config.KEY_STATUS)) {
case Config.STATUS_SUCCESS:
if (successCallback != null) {
List<Message> data  = new ArrayList<Message>();
JSONArray msgArray = jsonObj.getJSONArray(Config.KEY_TIMELINE);
JSONObject json = null;
System.out.println(msgArray.length());
for (int i = 0; i < msgArray.length(); i++) {
json = msgArray.getJSONObject(i);
data.add(new Message(json.getString(Config.KEY_MSGID),
json.getString(Config.KEY_MSG),json.getString(Config.KEY_PHONE_MD5)));
System.out.println(data.toString()+"555555555555555");
}
successCallback.onSuccess(jsonObj.getInt(Config.KEY_PAGE), jsonObj.getInt(Config.KEY_PAGE),
data);
}
break;
case Config.STATUS_INVALID_TOKEN:
if (failcallback != null) {
failcallback.onFail(Config.STATUS_INVALID_TOKEN);
}
default:
if (failcallback != null) {
failcallback.onFail(Config.STATUS_FAIL);
}
break;
}
} catch (JSONException e) {
if (failcallback != null) {
failcallback.onFail(Config.STATUS_FAIL);
}
}
}
}, new NetConnection.FailCallback() {

@Override
public void onFail() {
// TODO Auto-generated method stub
if (failcallback != null) {
failcallback.onFail(Config.STATUS_FAIL);
}
}
}, Config.KEY_ACTION,Config.ACTION_TIMELINE,Config.KEY_PHONE_MD5,phone_md5,
Config.KEY_TOKEN,token,Config.KEY_PAGE,page+"",Config.KEY_PERPAGE,perpage+"");
}
public static interface SuccessCallback{
void onSuccess(int page,int perpage,List<Message> timeline);
}
public static interface Failcallback{
void onFail(int errorCode);
}


}

`

这个类同样预留了两个接口,实现此类的时候需要实现。用来对取得数据进行操作和对失败情况进行操作,此类将获取的数据存进list中了。

3.需要对取得列表数据进行显示,本文用ListActivity来显示,同时需要实现BaseAdapter方法。实现的代码如下:

public class TimelineAdapter extends BaseAdapter{
private Context context;
public Context getContext(){
return this.context;
}
private List<Message> data = new ArrayList<Message>();
public TimelineAdapter(Context context) {
// TODO Auto-generated constructor stub
this.context = context;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void addAll(List<Message> data){
this.data.addAll(data);
notifyDataSetChanged();
}
public void clear(){
data.clear();
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.aty_timeline_list_cell, null);
convertView.setTag(new ListCell((TextView)convertView.findViewById(R.id.tvCell)));
}
ListCell lc = (ListCell)convertView.getTag();
Message msg = (Message) getItem(position);
lc.getTvCellLable().setText(msg.getMsg());
return convertView;
}
private static class ListCell{
private TextView tvCellLable;
public ListCell(TextView tvCellLable){
this.tvCellLable = tvCellLable;
}
public TextView getTvCellLable(){
return tvCellLable;
}
}

}


该类的构造方法需啊哟传入Context。至于adapater的数据时通过自己实现的addaLL方法来实现。

4.实现Timeline 类,并将数据传入adapter来显示。

具体代码如下:

private void loadMessage(){
System.out.println("losdlllllllllllll");
//final ProgressDialog pd = ProgressDialog.show(this, getResources().getString(R.string.connecting),
//getResources().getString(R.string.connect));
new Timeline(phone_md5, token, 1, 20, new Timeline.SuccessCallback() {
@Override
public void onSuccess(int page, int perpage, List<Message> timeline) {
// TODO Auto-generated method stub
//pd.dismiss();
adapter.clear();
adapter.addAll(timeline);
Toast.makeText(AtyTimeLine.this, R.string.fail_to_load_timeline, Toast.LENGTH_LONG).show();
}
}, new Timeline.Failcallback() {

@Override
public void onFail(int errorCode) {
// TODO Auto-generated method stub
//pd.dismiss();
if (errorCode == Config.STATUS_INVALID_TOKEN) {
startActivity(new Intent(AtyTimeLine.this,AtyLogin.class));
finish();
}else {
Toast.makeText(AtyTimeLine.this, R.string.fail_to_load_timeline, Toast.LENGTH_LONG).show();
}
}
});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐