获取服务器json数据并解析显示listview上
通过服务器返回的json数据并解析显示到listview控件上:
运行图:
服务器返回json格式:
{ "activity": [ { "name": "天王盖地虎", "startTime": "2017-03-02 00:00" }, { "name": "宝塔镇河妖", "startTime": "2017-03-02 00:00" }, { "name": "锄禾日当午", "startTime": "2017-03-02 00:00" }, { "name": "汗滴禾下土", "startTime": "2017-03-02 00:00" }, { "name": "谁知盘中餐", "startTime": "2017-03-02 00:00" }, { "name": "粒粒皆辛苦", "startTime": "2017-03-02 00:00" }, { "name": "套路深钢磨成针", "startTime": "2017-03-02 00:00" }, { "name": "这个世界都是假的", "startTime": "2017-03-02 00:00" }, { "name": "套路深钢磨成针", "startTime": "2017-03-02 00:00" }, { "name": "套路深钢磨成针", "startTime": "2017-03-02 00:00" } ], "description": "查询成功", "flag": "success" }
1、activity_main布局中添加listview控件
<ListView android:id="@+id/lv" android:layout_width="wrap_content" android:layout_height="wrap_content" />
添加好listview控件后,
创建listview的item布局起名为:listview_item
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="80dp" android:gravity="center" android:orientation="vertical" > <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试活动" /> <TextView android:layout_marginTop="20dp" android:id="@+id/shijian" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试时间" /> </LinearLayout> </RelativeLayout>
这里面就是2个文本用来显示json中的数据
2、MainActivity代码编辑
布局完成后来看一下activity中代码:
因为我使用okhttp网络请求开发所以需要下载okhttp架包导入libs里,下载地址:http://download.csdn.net/detail/qq_26650589/9811409
下载完成后解压文件,把2个架包导入libs中(2个架包都需要导入)
public JSONObject object; public ListView lv; public ArrayList<Map<String, Object>> list=new ArrayList<Map<String,Object>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { list.clear(); lv=(ListView) findViewById(R.id.lv); new Thread(new Runnable() { @Override public void run() { OkHttpClient okHttpClient=new OkHttpClient(); //服务器返回的地址 Request request=new Request.Builder() .url("http://10.0.2.2/date.json").build(); try { Response response=okHttpClient.newCall(request).execute(); //获取到数据 String date=response.body().string(); //把数据传入解析josn数据方法 jsonJX(date); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start();; } private void jsonJX(String date) { //判断数据是空 if(date!=null){ try { //将字符串转换成jsonObject对象 JSONObject jsonObject = new JSONObject(date); //获取返回数据中flag的值 String resultCode = jsonObject.getString("flag"); //如果返回的值是success则正确 if (resultCode.equals("success")) { //获取到json数据中里的activity数组内容 JSONArray resultJsonArray = jsonObject.getJSONArray("activity"); //遍历 for(int i=0;i<resultJsonArray.length();i++){ object=resultJsonArray.getJSONObject(i); Map<String, Object> map=new HashMap<String, Object>(); try { //获取到json数据中的activity数组里的内容name String name = object.getString("name"); //获取到json数据中的activity数组里的内容startTime String shijian=object.getString("startTime"); //存入map map.put("name", name); map.put("shijian", shijian); //ArrayList集合 list.add(map); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Message message = new Message(); message.what = 1; handler.sendMessage(message); } } catch (JSONException e) { e.printStackTrace(); } } } //Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据 @SuppressLint("HandlerLeak") public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: Mybaseadapter list_item=new Mybaseadapter(); lv.setAdapter(list_item); break; } } }; //listview的适配器 public class Mybaseadapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = getLayoutInflater().inflate(R.layout.listview_item, null); viewHolder.textView = (TextView) convertView.findViewById(R.id.tv); viewHolder.shijian = (TextView) convertView.findViewById(R.id.shijian); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.textView.setText(list.get(position).get("name").toString()); viewHolder.shijian.setText(list.get(position).get("shijian").toString()); return convertView; } } final static class ViewHolder { TextView textView; TextView shijian; }
注意:这里如果不开启handler将会报错:android.view.ViewRootImpl$CalledFromWrongThreadException错误。
最后1步 既然访问网络就必须添加访问网络权限: <uses-permission android:name="android.permission.INTERNET" />
好了到这里就能正常显示并解析出来了
相关文章:
将图片显示到listview上:http://blog.csdn.net/qq_26650589/article/details/71627933
将视频显示到listview上:http://blog.csdn.net/qq_26650589/article/details/77774703
获取数据显示RecyclerView: http://blog.csdn.net/qq_26650589/article/details/78084350
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。