Android之ListView访问网络数据

来源:互联网 发布:ab plc编程语言 编辑:程序博客网 时间:2024/05/16 06:37

一、服务器端

①在eclipse中创建Web->Dynamic web Project 工程名命为Web_ListView_Json。

②创建CityAction.java类(Servlet类)。此时会出错,原因是servlet-api.jar没有导入工程中,步骤如下:

工程名右键->Properties->Java Build Path->Libraries->Add External JARS->找到Apache-tomcat-7.0.34文件中lib文件夹下的servlet-api.jar(D:\java2EE\apache-tomcat-7.0.34\lib\servlet-api.jar)选中->打开->ok

package com.city.action;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONSerializer;/** * Servlet implementation class CityAction */@WebServlet("/CityAction")public class CityAction extends HttpServlet {private static final long serialVersionUID = 1L;    /**     * Default constructor.      */    public CityAction() {        // TODO Auto-generated constructor stub    }/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubthis.doPost(request, response);}/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html;charset=utf-8");response.setCharacterEncoding("utf-8");request.setCharacterEncoding("utf-8");PrintWriter writer=response.getWriter();String type=request.getParameter("type");if(type.equals("json")){List<String> list=CityDataSource.getCitysList();//生成json对象,json数据一定要带<K,V>Map<String, List<String>>map=new HashMap<String, List<String>>();map.put("citys", list);String jsonString=JSONSerializer.toJSON(map).toString();writer.println(jsonString);//注意生成json字符串时,这个地方一定要是独立干净的}writer.flush();writer.close();}}

③提供简单的数据源:声明一个类CityDataSource.java

package com.city.action;import java.util.ArrayList;import java.util.List;public class CityDataSource {public CityDataSource() {// TODO Auto-generated constructor stub}/** * 提供数据源 * @return */public static List<String> getCitysList(){List<String> list=new ArrayList<String>();for(int i=0;i<25;i++){list.add("北京"+i);}//为了增强滑动效果,用for增加数据集合return list;}}
测试:

在地址栏输入http://192.168.1.102:8080/Web_ListView_Json/CityAction?type=json效果图如下


二、手机客户端

把数据提交到列表信息上

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.android_listview.MainActivity" >    <ListView        android:id="@+id/listView1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"         >    </ListView></RelativeLayout>
一定要记得在AndroidManifest.xml中加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>
①新建包com.example.android_listview_web.http中创建工具类HttpUtils.java取得json数据

package com.example.android_listview_web.http;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;public class HttpUtils {public HttpUtils() {// TODO Auto-generated constructor stub}/** *  * @param path  获取指定路径的json信息 * @param encoding  指定编码格式 * @return */public static String sendPostMethod(String path,String encoding){String result="";HttpClient httpClient=new DefaultHttpClient();try {HttpPost post=new HttpPost(path);HttpResponse response=httpClient.execute(post);if(response.getStatusLine().getStatusCode()==200){result=EntityUtils.toString(response.getEntity(), encoding);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally{httpClient.getConnectionManager().shutdown();//关闭连接}return result;}}
②新建包com.example.android_asynctask_json.json中创建工具类JsonTools.java对json数据进行解析

package com.example.android_listview_web.json;import java.util.ArrayList;import java.util.List;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class JsonTools {public JsonTools() {// TODO Auto-generated constructor stub}/** *  * @param jsonString * @return */public static List<String> parseList(String jsonString){List<String> list=new ArrayList<String>();try {JSONObject jsonObject=new JSONObject(jsonString);//得到 {"citys":["北京1","北京2"..."北京23","北京24"]} 这个大对象JSONArray jsonArray=jsonObject.getJSONArray("citys");for(int i=0;i<jsonArray.length();i++){list.add(jsonArray.getString(i));}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}}
③在MainActivity.java中

package com.example.android_listview_web;import java.util.List;import com.example.android_listview_web.http.HttpUtils;import com.example.android_listview_web.json.JsonTools;import android.support.v7.app.ActionBarActivity;import android.app.ProgressDialog;import android.os.AsyncTask;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends ActionBarActivity {private ListView listView;private ArrayAdapter<String> adapter;private ProgressDialog dialog;private final String CITY_PATH="http://192.168.1.102:8080/Web_ListView_Json/CityAction?type=json";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dialog=new ProgressDialog(MainActivity.this);dialog.setTitle("提示");dialog.setMessage("loading...");listView=(ListView) this.findViewById(R.id.listView1);new MyTask().execute(CITY_PATH);}class MyTask extends AsyncTask<String, Void, List<String>>{@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();dialog.show();}@Overrideprotected List<String> doInBackground(String... params) {// TODO Auto-generated method stubString jsonString=HttpUtils.sendPostMethod(params[0], "utf-8");List<String> list=JsonTools.parseList(jsonString);return list;}@Overrideprotected void onPostExecute(List<String> result) {// TODO Auto-generated method stubsuper.onPostExecute(result);adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_expandable_list_item_1, result);listView.setAdapter(adapter);adapter.notifyDataSetChanged();//一旦适配器有数据,直接通知listView更新dialog.dismiss();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}
运行效果图


1 0