您的位置:首页 > Web前端 > JavaScript

利用百度APIStoreSDK获取Json数据并解析加载到ListView上

2016-04-16 10:28 591 查看
[align=left]
效果图(这里只是截取了List中的一项):
[/align]



一、:登录百度ApiStore,获取移动sdk Android版(同时有使用文档和示例),将jar包导入到项目中

Android Studio请在放入libs目录后,在project structure-> Dependencies-> File Dependency中添加jar包依赖。

在AndroidManifest.xml中,加入所需权限,这些权限将帮助sdk判断网络状态:

<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

在调用APIStoreSDK的接口前需要进行初始化, 这一步必须在Application中完成。

你需要在项目中建立一个继承自Application的类,并在项目配置文件AndroidManifest.xml中application标签下android:name中指定该类:

android:name=".MyApplication"

MyApplication中添加的代码如下:
import android.app.Application;
import com.baidu.apistore.sdk.ApiStoreSDK;

public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
ApiStoreSDK.init(this, "这里填写在百度ApiStore获取的apikey");
}
}

APIStoreSDK封装了完整的异步网络请求和回调逻辑,回调要继承ApiCallBack类并改写其中的onSuccess()、onError()、onComplete()方法(如不需要,可不用都写)。onSuccess会在请求成功时调用,onError会在请求失败时调用,onComplete总是会调用。responseString是api接口返回的响应字符串,或者空(请求失败时)。(以上内容来自为百度ApiStoreSdk说明文档)

在MainActivity中调用的如下:

private void apiTest() {
Parameters para = new Parameters();
//接口请求参数
para.put("num",10);
//这里访问的是美女图片的接口地址
ApiStoreSDK.execute("http://apis.baidu.com/txapi/mvtp/meinv",
ApiStoreSDK.GET,
para,
new ApiCallBack() {
@Override
public void onSuccess(int status, String responseString) {
Log.i("API Store", "onSuccess");
//responseString为返回的Json数据
//将获取的Json数据解析并加载到自定义的ListView中,下面会有说明
new HttpJson(listView, adapter, handler, responseString).start();
}

@Override
public void onComplete() {
Log.i("API Store", "onComplete");
}
@Override
public void onError(int status, String responseString, Exception e) {
Log.i("API Store", "onError, status: " + status);
Log.i("API Store", "errMsg: " + (e == null ? "" : e.getMessage()));
Log.i("API Store",getStackTrace(e));
}
});
}

String getStackTrace(Throwable e) {
if (e == null) {
return "";
}
StringBuilder str = new StringBuilder();
str.append(e.getMessage()).append("\n");
for (int i = 0; i < e.getStackTrace().length; i++) {
str.append(e.getStackTrace()[i]).append("\n");
}
return str.toString();
}



以上就完成了Json数据的获取,接下来需要解析Json数据,解析Json数据就是确定Json数据的格式,并从中获取需要的数据,可以在onSuccess方法中通过打印Log来查看Json数据,将其复制到网上在线格式化确定其格式,每种格式解析方式都大同小异,下面只针对本例返回值讲解,贴出responString中数据格式化后的结果(由于默认返回值为10,这里只截取3个用作演示):
{
"code": 200,
"msg": "success",
"newslist": [
{
"ctime": "2016-03-06 14:11",
"title": "巨乳杉原杏璃 Anri Sugihara 写真集 Gravure Idols & Misty C",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/06/m.xxxiao.com_d458e312c6ff6ca3126749ecd922dbf6-760x500.jpg",
"url": "http://m.xxxiao.com/1644"
},
{
"ctime": "2016-03-06 14:11",
"title": "韩国性感车模制服展场靓丽图片",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_8000d44d92b4ea5aba46b13bd938e0e48-760x500.jpg",
"url": "http://m.xxxiao.com/892"
},
{
"ctime": "2016-03-06 14:11",
"title": "[TGOD推女神] 性感少妇Aline艾琳私房写真",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_26da7f08a6170deda90a8bcd208618f9-760x500.jpg",
"url": "http://m.xxxiao.com/249"
},
{
"ctime": "2016-03-06 14:11",
"title": "充气娃娃王依萌制服诱惑性爱美女",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_b3149ecea4628efd23d2f86e5a72347218-760x500.jpg",

4000
"url": "http://m.xxxiao.com/775"
},
{
"ctime": "2016-03-06 14:11",
"title": "咖啡馆邂逅忧伤的姑娘",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_6bb61e3b7bce0931da574d19d1d82c88-690x500.jpg",
"url": "http://m.xxxiao.com/123"
},
{
"ctime": "2016-03-06 14:11",
"title": "清新美眉爱上金鱼唯美写真",
"description": "美女图片",
"picUrl": "http://t1.27270.com/uploads/150725/8-150H5103439118.jpg",
"url": "http://www.27270.com/ent/meinvtupian/2015/51488.html"
},
{
"ctime": "2016-03-06 14:11",
"title": "短发美女激情劲爆性感艺术照",
"description": "美女图片",
"picUrl": "http://t1.27270.com/uploads/150725/8-150H5155Rb36.jpg",
"url": "http://www.27270.com/ent/meinvtupian/2015/51899.html"
},
{
"ctime": "2016-03-06 14:11",
"title": "美女旗袍红唇恋上香烟艺术照",
"description": "美女图片",
"picUrl": "http://t1.27270.com/uploads/150725/8-150H5153A5D6.jpg",
"url": "http://www.27270.com/ent/meinvtupian/2015/51904.html"
},
{
"ctime": "2016-03-06 14:11",
"title": "嫩模郭南汐变身清纯美女秘书",
"description": "美女图片",
"picUrl": "http://t1.27270.com/uploads/150727/8-150HFZ92R48.jpg",
"url": "http://www.27270.com/ent/meinvtupian/2015/50564.html"
},
{
"ctime": "2016-03-06 14:11",
"title": "火辣红妆爆乳车模张雅琦魅惑壁纸",
"description": "美女图片",
"picUrl": "http://m.xxxiao.com/wp-content/uploads/sites/3/2015/04/m.xxxiao.com_a8d2ec85eaf98407310b72eb73dda2474-760x500.jpg",
"url": "http://m.xxxiao.com/419"
}
]
}


接下来就要解析出需要的数据,下面另起了HttpJson线程,在构造方法中传入了四个参数,并将parseJson方法返回的带有10个对象的pictureList添加到adapter中。
import android.os.Handler;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;

public class HttpJson extends Thread {
private List<BeautifulGirlsPicture> pictureList = new ArrayList<>();
private ListView listView;
private MyJsonAdapter adapter;
private Handler handler;
private String jsonData;

/**
* @param listView 用于显示数据的list
* @param adapter 为listview自定义的适配器
* @param handler 更新UI
* @param jsonData Json数据
*/
public HttpJson(ListView listView, MyJsonAdapter adapter, Handler handler, String jsonData) {
this.listView = listView;
this.adapter = adapter;
this.handler = handler;
this.jsonData = jsonData;
}

@Override
public void run() {
pictureList = parseJson(jsonData);
handler.post(new Runnable() {
@Override
public void run() {
//数据适配器中添加数据
adapter.addData(pictureList);
//ListView指定数据适配器
listView.setAdapter(adapter);
}
});
}

/**
* 获取Json数据中的List集合
*/
private List<BeautifulGirlsPicture> parseJson(String jsonData) {

try {
//将数据转换为JSONObject
JSONObject jsonObject = new JSONObject(jsonData);
//通过JSONObject将JSONArray中的数组(newlist)解析出来
JSONArray jsonArray = jsonObject.getJSONArray("newslist");

for (int i = 0; i < jsonArray.length(); i++) {
//再将jsonArray中每组中的数据(含有title,picUrl,url等)转换为jsonObject
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
//实例化BeautifulGirlsPicture并利用jsonObject为其各变量赋值
BeautifulGirlsPicture bgPicture = new BeautifulGirlsPicture();
bgPicture.setTitle(jsonObject1.getString("title"));
bgPicture.setDescription(jsonObject1.getString("description"));
bgPicture.setPicUrl(jsonObject1.getString("picUrl"));
bgPicture.setUrl(jsonObject1.getString("url"));
pictureList.add(bgPicture);
}
return pictureList;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
自定义Adapter
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class MyJsonAdapter extends BaseAdapter {
private List<BeautifulGirlsPicture> list;
private LayoutInflater inflator;
private Handler handler = new Handler();
private Context context;

public MyJsonAdapter(Context context) {
this.context = context;
inflator = LayoutInflater.from(context);
}

public void addData(List<BeautifulGirlsPicture> data) {
this.list = data;
}

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

@Override
public Object getItem(int i) {
return list.get(i);
}

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

@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = inflator.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
BeautifulGirlsPicture beautifulGirlsPicture = list.get(i);
viewHolder.title.setText(beautifulGirlsPicture.getTitle());
viewHolder.description.setText(beautifulGirlsPicture.getDescription());
viewHolder.url.setText(beautifulGirlsPicture.getUrl());
new HttpImage(beautifulGirlsPicture.getPicUrl(), handler, viewHolder.imageView).start();
return convertView;
}

class ViewHolder {
private ImageView imageView;
private TextView title;
private TextView description;
private TextView url;

public ViewHolder(View view) {
title = (TextView) view.findViewById(R.id.id_tv_title);
description = (TextView) view.findViewById(R.id.id_tv_des);
imageView = (ImageView) view.findViewById(R.id.id_iv);
url= (TextView) view.findViewById(R.id.id_tv_time);
}
}
}


通过Url加载图片

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class LoadImage extends Thread {
private ImageView imageView;
private Handler handler;
private String url;

public LoadImage(String url, Handler handler, ImageView imageView) {
this.url = url;
this.handler = handler;
this.imageView = imageView;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setReadTimeout(5000);
connection.setRequestMethod("GET");
InputStream inputStream = connection.getInputStream();
final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
} catch (IOException e) {
e.printStackTrace();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview json