android之简易新闻客户端
将一个新闻信息保存到一个XML文件中,并将放在服务器下。通过手机客户端来从服务器下载该文件并解析显示。
news.xml
<?xml version="1.0" encoding="UTF-8" ?> <newslist> <news> <title>黑马52期就业快报</title> <detail>热烈祝贺黑马52期平均薪水突破13k</detail> <comment>15687</comment> <image>http://192.168.0.109/images/6.jpg</image> </news> <news> <title>程序员因写代码太乱被杀害</title> <detail>凶手是死者同事,维护死者代码时完全看不懂而痛下杀手</detail> <comment>16359</comment> <image>http://192.168.0.109/images/7.jpg</image> </news> <news> <title>3Q大战宣判: 腾讯获赔500万</title> <detail>最高法驳回360上诉, 维持一审宣判.</detail> <comment>6427</comment> <image>http://192.168.0.109/images/1.jpg</image> </news> <news> <title>今日之声:北大雕塑被戴口罩</title> <detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail> <comment>681</comment> <image>http://192.168.0.109/images/2.jpg</image> </news> <news> <title>轻松一刻: 我要沉迷学习不自拔</title> <detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail> <comment>11616</comment> <image>http://192.168.0.109/images/4.jpg</image> </news> <news> <title>男女那些事儿</title> <detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail> <comment>10339</comment> <image>http://192.168.0.109/images/5.jpg</image> </news> <news> <title>赵帅哥语录一</title> <detail>少壮不努力,老大做IT</detail> <comment>14612</comment> <image>http://192.168.0.109/images/8.jpg</image> </news> <news> <title>奥巴马见达是装蒜</title> <detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail> <comment>1359</comment> <image>http://192.168.0.109/images/3.jpg</image> </news> </newslist>
新闻信息以XML方式进行保存,文件的编码是UTF-8。文件中的IP地址是自己服务器地址,图片需要自己准备。
布局文件
子布局文件item_list.xml
<?xml version="1.0" encoding="utf-8"?> <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="wrap_content" tools:context="xidian.dy.com.chujia.MainActivity"> <com.loopj.android.image.SmartImageandroid:id="@+id/img" android:layout_width="72dp" android:layout_height="72dp" android:src="@drawable/dog" android:layout_centerVertical="true" /> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="小狗" android:textSize="22sp" android:layout_toRightOf="@+id/img" /> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是一条小狗" android:layout_below="@+id/title" android:layout_alignLeft="@+id/title" android:lines="2" android:textColor="@android:color/darker_gray" android:textSize="15sp" /> <TextView android:id="@+id/comment" android:layout_width="wrap_content" android:layout_below="@+id/content" android:layout_height="wrap_content" android:text="1223条评论" android:textColor="#ff0000" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> </RelativeLayout>
主布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context="xidian.dy.com.chujia.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content"> </ListView> </LinearLayout>
java代码
javabean
package xidian.dy.com.chujia; /** * Created by dy on 2016/6/25. */ public class NewsBean { private String title; private String content; private String commnets; private String imgUrl; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getCommnets() { return commnets; } public void setCommnets(String commnets) { this.commnets = commnets; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } }
MainActivity.java
package xidian.dy.com.chujia; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.util.Xml; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.loopj.android.image.SmartImageView; import org.xmlpull.v1.XmlPullParser; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private List<NewsBean> list; Handler handler = new Handler(){ //主线程从list中获取新闻内容 @Override public void handleMessage(Message msg) { if(msg.what == 0){ ListView lv = (ListView) findViewById(R.id.lv); if(lv != null){ lv.setAdapter(new MyAdapter()); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getNewsFromNet(); } private void getNewsFromNet(){ list = new ArrayList<>(); new Thread(new Runnable() { NewsBean news; @Override public void run() { try { //从获取新闻内容,传输格式的XML //通过PULL模式解析XML文件并将其封装为javabean保存到List中 URL url = new URL("http://192.168.0.109/news.xml"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); if(conn.getResponseCode() == 200){ InputStream is = conn.getInputStream(); XmlPullParser xmlPull = Xml.newPullParser(); xmlPull.setInput(is,"utf-8"); while (xmlPull.getEventType() != XmlPullParser.END_DOCUMENT){ if(xmlPull.getEventType() == XmlPullParser.START_TAG) if(xmlPull.getName().equals("news")) news = new NewsBean(); else if(xmlPull.getName().equals("title")){ news.setTitle(xmlPull.nextText());} else if(xmlPull.getName().equals("detail")) news.setContent(xmlPull.nextText()); else if(xmlPull.getName().equals("comment")) news.setCommnets(xmlPull.nextText()); else if(xmlPull.getName().equals("image")){ news.setImgUrl(xmlPull.nextText()); } if(xmlPull.getEventType() == XmlPullParser.END_TAG && xmlPull.getName().equals("news")) list.add(news); xmlPull.next(); } } } catch (Exception e) { e.printStackTrace(); } //解析完毕向主线程发送消息 handler.sendEmptyMessage(0); } }).start(); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { NewsBean news = list.get(position); ViewHolder vh; View v; if(convertView == null){ //将一个布局文件转为一个View对象 v = View.inflate(MainActivity.this, R.layout.item_list, null); SmartImageView siv = (SmartImageView) v.findViewById(R.id.img); TextView tv1 = (TextView) v.findViewById(R.id.title); TextView tv2 = (TextView) v.findViewById(R.id.content); TextView tv3 = (TextView) v.findViewById(R.id.comment); vh = new ViewHolder(); vh.siv = siv; vh.tvTitle = tv1; vh.tvContent = tv2; vh.tvComment = tv3; //为v添加附带信息,方便下次使用 v.setTag(vh); } else{ //使用缓存中的View对象,避免重新创建 v = convertView; vh = (ViewHolder) v.getTag(); } if(vh.siv != null) vh.siv.setImageUrl(news.getImgUrl()); if(vh.tvTitle != null) vh.tvTitle.setText(news.getTitle()); if(vh.tvContent != null) vh.tvContent.setText(news.getContent()); if(vh.tvComment != null) vh.tvComment.setText(news.getCommnets()); return v; } class ViewHolder{ public SmartImageView siv; public TextView tvTitle; public TextView tvContent; public TextView tvComment; } } }
效果展示
在代码中引入了第三方代码android-smart-image-view