如何做一个简易的新闻客户端
1,下载一个服务端 tomcat 下载后开始运行,将需要浏览的东西,放在webapps-root文件下 这里假设有一个xml小文件,接下来就开始上代码了, 在同一个包下给mainactivity创造两个class文件,一个用来解析xml文件(解析方式多种,有兴趣可以上网查阅资料),一个用于存放数据 1,存放数据: package com.example.xinwen; public class News { private String city; private String temp; private String wind; private String pm250; private String image; public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getTemp() { return temp; } public void setTemp(String temp) { this.temp = temp; } public String getWind() { return wind; } public void setWind(String wind) { this.wind = wind; } public String getPm250() { return pm250; } public void setPm250(String pm250) { this.pm250 = pm250; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } } 2,解析xml文件 (1)假设xml文件长这样,将它放进tomcat里面即可 <?xml version="1.0" encoding="utf-8"?> <weather> <channel> <city>北京</city> <temp>25°</temp> <image>http://192.168.1.101:8080/img/a.jpg</image> <wind>1</wind> <pm250>300</pm250> </channel> <channel> <city>郑州</city> <temp>20°</temp> <image>http://192.168.1.101:8080/img/b.jpg</image> <wind>2</wind> <pm250>300</pm250> </channel> <channel> <city>长春</city> <temp>10°</temp> <image>http://192.168.1.101:8080/img/c.jpg</image> <wind>3</wind> <pm250>100</pm250> </channel> <channel> <city>沈阳</city> <temp>20°</temp> <image>http://192.168.1.101:8080/img/d.jpg</image> <wind>3</wind> <pm250>50</pm250> </channel> </weather> (2)开始解析 package com.example.xinwen; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.util.Xml; public class XmlPasser { //解析xml的业务方法 public static List<News> parserXml(InputStream in) throws Exception{ List<News> newsLists=null; News news=null; //获取xml解析器 XmlPullParser parser=Xml.newPullParser(); //设置解析器,要解析的内容 parser.setInput(in,"utf-8"); //获取要解析的事件类型 int type=parser.getEventType(); //不得向下解析 while(type!=XmlPullParser.END_DOCUMENT){ switch(type){ case XmlPullParser.START_TAG://解析开始节点 //[6]具体判断一下是哪个标签 if("weather".equals(parser.getName())){ newsLists=new ArrayList<News>(); }else if("channel".equals(parser.getName())){ news=new News(); }else if("city".equals(parser.getName())){ news.setCity(parser.nextText()); }else if("temp".equals(parser.getName())){ news.setTemp(parser.nextText()); }else if("image".equals(parser.getName())){ news.setImage(parser.nextText()); }else if("wind".equals(parser.getName())){ news.setWind(parser.nextText()); }else if("pm250".equals(parser.getName())){ news.setPm250(parser.nextText()); } break; case XmlPullParser.END_TAG://解析结束标签 if("channel".equals(parser.getName())){ //把Javabean添加到集合 newsLists.add(news); } break; } //不停向下解析 type=parser.next(); } return newsLists; } } 3,好了副class文件制作好了,就开始在mainactivity中制作正文了 package com.example.xinwen; import android.os.Bundle; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.List; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { private List<News> newsLists; private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); //[2]准备listview要显示的数据,去服务器取数据进行封装 initListData(); } //准备listview的数据 private void initListData(){ new Thread(){ public void run(){ try { //[2]去服务器取数据http://192.168.1.104:8080/weather.xml String path="http://192.168.1.101:8080/weather.xml"; //小白强烈注意,192.168.1.101使用的是本地ip,至于如何查看本地ip上网百度 //[2.2]创建URL 对象指定我们要访问的 网址(路径) URL url = new URL(path); //[2.3]拿到httpurlconnection对象 用于发送或者接收数据 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //[2.4]设置发送get请求 conn.setRequestMethod("GET");//get要求大写 默认就是get请求 //[2.5]设置请求超时时间 conn.setConnectTimeout(5000); //[2.6]获取服务器返回的状态码 int code = conn.getResponseCode(); //[2.7]如果code == 200 说明请求成功 if(code==200){ //[2.8]获取服务器返回的数据 是以流的形式返回的 由于把流转换成字符串是一个非常常见的操作 所以我抽出一个工具类(utils) InputStream in = conn.getInputStream(); newsLists = XmlPasser.parserXml(in); runOnUiThread(new Runnable(){ @Override public void run() { // TODO 自动生成的方法存根 //更新ui把数据展示到子线程 lv.setAdapter(new MyAdapter()); } }); } } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } };}.start(); } private class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO 自动生成的方法存根 return newsLists.size(); } @Override public Object getItem(int arg0) { // TODO 自动生成的方法存根 return null; } @Override public long getItemId(int arg0) { // TODO 自动生成的方法存根 return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if(convertView==null){ view=View.inflate(getApplicationContext(), R.layout.item, null); }else{ view =convertView; } //找到控件显示集合里面的数据 ImageView iv_icon=(ImageView) view.findViewById(R.id.iv_icon); TextView tv_title=(TextView) view.findViewById(R.id.tv_title); TextView tv_desc=(TextView) view.findViewById(R.id.tv_desc); TextView tv_type=(TextView) view.findViewById(R.id.tv_type); //展示数据 tv_title.setText(newsLists.get(position).getCity()); tv_desc.setText(newsLists.get(position).getTemp()); String typee=newsLists.get(position).getWind(); String comment=newsLists.get(position).getPm250(); int type=Integer.parseInt(typee); switch(type){ case 1: tv_type.setText(comment+"国内"); break; case 2: tv_type.setText("跟帖"); break; case 3: tv_type.setText("国外"); break; } return view; } } } 至此src下的正文部分结束 我们接下来要来控制按钮这些内容了,在res-layout下创建一个子xml <?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" > <ImageView android:id="@+id/iv_icon" android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:layout_toRightOf="@+id/iv_icon" android:ellipsize="end" android:singleLine="true" android:text="sadasaddsasdasdada" android:textColor="#000000" android:textSize="18sp" /> <TextView android:id="@+id/tv_desc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/iv_icon" android:layout_below="@id/tv_title" android:layout_marginTop="6dp" android:layout_toRightOf="@id/iv_icon" android:ellipsize="end" android:maxLines="2" android:text="啊结果了敬爱个路口就爱看的两个件上的故事格式的公共的十大歌手大事" android:textColor="#999999" android:textSize="14sp" /> <TextView android:id="@+id/tv_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/iv_icon" android:layout_alignParentRight="true" android:layout_marginRight="3dp" android:text="跟帖" android:textColor="#ff0000" android:textSize="14sp" /> </RelativeLayout> 这样就制作成功了,最后勿忘给安卓adt一个上网许可(百度) 本文转自眉间雪 51CTO博客,原文链接:http://blog.51cto.com/13348847/1979569,如需转载请自行联系原作者