牛骨文教育服务平台(让学习变的简单)
博文笔记

获取服务器json数据并解析显示listview上

创建时间:2017-04-20 投稿人: 浏览次数:4510

通过服务器返回的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










声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。