JSON文本很简单,只放了两个数据
[{"number":"17817771329.I'm no.1","money":"0"},
{"number":"13538046947","money":"0"},
{"number":"13538046775","money":"0"},
{"number":"13538046740","money":"0"},
{"number":"13538046721","money":"0"},
{"number":"13538046701","money":"0"},
{"number":"13538046639","money":"0"},
{"number":"13538046609","money":"0"},
{"number":"13538046584","money":"0"},
{"number":"13538046581","money":"0"},
{"number":"17817771329I'm no.2","money":"0"}]
我已经把JSON文本已经放在DEMO项目里面了。
private void readFromAssets() {
try {
InputStream is = getAssets().open("test.txt");//此处为要加载的json文件名称
String text = readTextFromSDcard(is);
handleCitiesResponse(text);
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("readFromAssets", e.toString());
}
}
private String readTextFromSDcard(InputStream is) throws Exception {
InputStreamReader reader = new InputStreamReader(is, "GB2312");
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer buffer = new StringBuffer("");
String str;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
buffer.append("\n");
}
return buffer.toString();//把读取的数据返回
}
直接获取本地txt文本拿到json数据
如果有服务器的可以直接用方法
private void init() {
new Thread(new Runnable() {
@Override
public void run() {
OkHttpClient okHttpClient = new OkHttpClient.Builder().
connectTimeout(10, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(15, TimeUnit.SECONDS).build();//设置读取超时时间;
//服务器返回的地址
Request request = new Request.Builder()
.url("http://10.0.2.2:8088/date.json").build();
try {
Response response = okHttpClient.newCall(request).execute();
//获取到数据
String date = response.body().string();
//把数据传入解析josn数据方法
handleCitiesResponse(date);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(e instanceof SocketTimeoutException) {//判断超时异常
Looper.prepare();
Toast.makeText(getApplicationContext(), "网络超时,请确认网络是否正常。", Toast.LENGTH_LONG).show();
Looper.loop();
}
if(e instanceof ConnectException) {//判断连接异常
Looper.prepare();
Toast.makeText(getApplicationContext(), "连接超时,请确认网络是否正常。", Toast.LENGTH_LONG).show();
Looper.loop();
}
}
};
}).start();
}
用okhttp方法获取服务器
url("http://10.0.2.2:8088/date.json")
直接把地址修改一下就可以了。
okhttp使用需要在配置build.gradle里加上
compile 'com.squareup.okhttp3:okhttp:3.4.1'
在判断连接超时连接异常的时候,不能直接吐司,需要在吐司前后加上
Looper.prepare();
Looper.loop();
不然就会出错误
接下来看一下json解析
private void handleCitiesResponse(String date) {
//判断数据是空
if (date != null) {
try {
JSONArray jsonArray = new JSONArray(date);
//将字符串转换成jsonObject对象
//遍历*/
for (int i = 0; i<jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
Map<String, Object> map = new HashMap<>();
//获取到json数据中的activity数组里的内容name
String number = object.getString("number");
//获取到json数据中的activity数组里的内容startTime
String money = object.getString("money");
//存入map
map.put("number", number);
map.put("money", money);
//ArrayList集合
list.add(map);
}
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
重要的部分都用注释加上了,这个也是比较基础的,虽然我也是新手。
listview适配器。
public class Mybaseadapter extends BaseAdapter {
ArrayList<Map<String, Object>> getmList() {
return mList;
}
private ArrayList<Map<String, Object>> mList;
Mybaseadapter(ArrayList<Map<String, Object>> mList) {
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
接下来就是把JSON解析的数据绑定在对应的textview上
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
// ViewHolder viewHolder = null;
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = getLayoutInflater().inflate(R.layout.listview_text, null);
viewHolder.number = (TextView) convertView.findViewById(R.id.tv1);
viewHolder.money = (TextView) convertView.findViewById(R.id.tv2);
// viewHolder.no = convertView.findViewById(R.id.tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Map<String, Object> bean = mList.get(position);
viewHolder.number.setText(bean.get("number").toString());
viewHolder.money.setText(bean.get("money").toString());
// viewHolder.no.setText(position + "/" + mList.size() + "/" + list.size());
return convertView;
}
布局里比较简单,主布局只放了一个listview
内容布局放了2个textview
还有一个加载布局。
附上效果图
DEMO项目地址:DEMO下载
适合新手参考,demo可以直接用,不复杂。