今天我们来对前面讲过的知识综合运用一下,包括xml的PULL解析,listView的万能适配器等知识。。。。
那先来看一个组件—->智能图片加载器(smart-image-view),它可以很方便的加载一张网络图片。
SmartImageView的设计初衷是来取代Android自带的ImgageView组件,另外它还提供了一些附加功能,如:
支持通过URL来加载图片;
支持从电话簿中加载图片;
异步加载图片;
图片被缓存在内存,以便下次快速加载显示;
SmartImageView类可以被很容易扩展成对其它资源的调用;
而且使用起来非常简单,使用步骤:
①将智能图片加载器的jar包或者源码下载下来。
jar包下载地址:android-smart-image-view-1.0.0.jar
②在xml布局文件中添加一个控件
<com.loopj.android.image.SmartImageView android:id="@+id/my_image" />
③获取引用
SmartImageView myImage = (SmartImageView)this.findViewById(R.id.my_image);
④获取网络图片
myImage.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");
注:
获取网络图片,这个过程本身就是异步。不必再进行处理,也不必担心线程阻塞
网络获取到的图片都进行了缓存的处理。会在程序的cache目录下建/web_image_cache/,图片存在这里
再次使用的时候,如果缓存图片已经存在,则不再从网络获取图片
先看.setImageUrl都有什么方法
1、最普通的一个,直接设置图片地址
// Helpers to set image by URL
public void setImageUrl(String url) {
setImage(new WebImage(url));
}
2、有一个接口,完成下载的时候调用
public void setImageUrl(String url, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), completeListener);
}
3、从字面意思可以看出,是一个备用的资源。如果从网络获取图片失败,则使用备用资源
public void setImageUrl(String url, final Integer fallbackResource) {
setImage(new WebImage(url), fallbackResource);
}
4、类似上面
public void setImageUrl(String url, final Integer fallbackResource, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), fallbackResource, completeListener);
}
5、多了一个loadingResource,就是正在下载的时候展示的图片
public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource) {
setImage(new WebImage(url), fallbackResource, loadingResource);
}
6、类似上面
public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource, SmartImageTask.OnCompleteListener completeListener) {
setImage(new WebImage(url), fallbackResource, loadingResource, completeListener);
}
接下来我们可以来制作我们的简易新闻客户端了。
效果:
我们可以看到这是一个很简单的新闻客户端,没错,所以叫简易的新闻,主要是为了综合运用一下前面所讲的东西。
下面开始分析:
①首先这个客户端有两个Activity,一个是新闻的列表,用一个ListView来装,另外一个是详情界面,只是将点击的新闻传递下去,没有做太多。
那么第一步就应该把数据获取过来,现在只是测试一下,所以只是将新闻数据放在本地的服务器上。这里采用了HttpURLConnection的方式去想访问服务器。
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(3000);
conn.setReadTimeout(3000);
conn.connect();
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
//使用PULL解析器解析这个流
parseNewsXml(is);
}else {
Message msg = Message.obtain();
msg.what = FAIL;
mHandler.sendMessage(msg);
}
②这里服务器返回的是xml文件,所以我们应该对这个xml文件进行解析。这里选用PULL解析。
新闻数据:
news.xml
<?xml version="1.0" encoding="UTF-8" ?>
<newslist>
<news>
<title>安徽副省长罗马</title>
<detail>今天下午,中纪委通报安徽省副省长杨振超落马,安徽是今年中央巡视组“回头看”的四省份之一</detail>
<comment>15687</comment>
<image>http://192.168.30.1:8089/images/6.jpg</image>
</news>
<news>
<title>程序员因写代码太乱被杀害</title>
<detail>凶手是死者同事,维护死者代码时完全看不懂而痛下杀手</detail>
<comment>16359</comment>
<image>http://192.168.30.1:8089/images/7.jpg</image>
</news>
<news>
<title>产品经理因频繁改需求被杀害</title>
<detail>凶手是一名程序员,因死者对项目需求频繁改动而痛下杀手</detail>
<comment>14112</comment>
<image>http://192.168.30.1:8089/images/7.jpg</image>
</news>
<news>
<title>3Q大战宣判: 腾讯获赔500万</title>
<detail>最高法驳回360上诉, 维持一审宣判.</detail>
<comment>6427</comment>
<image>http://192.168.30.1:8089/images/1.jpg</image>
</news>
<news>
<title>今日之声:北大雕塑被戴口罩</title>
<detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
<comment>681</comment>
<image>http://192.168.30.1:8089/images/2.jpg</image>
</news>
<news>
<title>奥巴马见达赖是装蒜</title>
<detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
<comment>1359</comment>
<image>http://192.168.30.1:8089/images/3.jpg</image>
</news>
<news>
<title>轻松一刻: 我要沉迷学习不自拔</title>
<detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
<comment>11616</comment>
<image>http://192.168.30.1:8089/images/4.jpg</image>
</news>
<news>
<title>男女那些事儿</title>
<detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
<comment>10339</comment>
<image>http://192.168.30.1:8089/images/5.jpg</image>
</news>
<news>
<title>帅哥语录一</title>
<detail>少壮不努力,老大做IT</detail>
<comment>14612</comment>
<image>http://192.168.30.1:8089/images/8.jpg</image>
</news>
<news>
<title>帅哥语录二</title>
<detail>问君能有几多愁,恰似调完代码改需求</detail>
<comment>13230</comment>
<image>http://192.168.30.1:8089/images/8.jpg</image>
</news>
<news>
<title>帅哥语录三</title>
<detail>觉得我帅的人工资一般都比较高</detail>
<comment>9928</comment>
<image>http://192.168.30.1:8089/images/8.jpg</image>
</news>
<news>
<title>今日之声:北大雕塑被戴口罩</title>
<detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
<comment>681</comment>
<image>http://192.168.30.1:8089/images/2.jpg</image>
</news>
</newslist>
如果你下载下来进行测试的话,请记得将xml文件中的图片标签的ip地址改为自己本机的ip地址。
解析方法:
/** * 使用PULL解析 * @param is 输入流 */
protected void parseNewsXml(InputStream is) {
XmlPullParser xp = Xml.newPullParser();
try {
//解析输出流的位置
xp.setInput(is, "utf-8");
int eventType = xp.getEventType();
while (eventType != XmlResourceParser.END_DOCUMENT) {
switch (eventType) {
case XmlResourceParser.START_DOCUMENT:
mNewsList = new ArrayList<News>();
break;
case XmlResourceParser.START_TAG:
if ("news".equals(xp.getName())) {
news = new News();
}else if ("title".equals(xp.getName())) {
news.setTitle(xp.nextText());
}else if ("detail".equals(xp.getName())) {
news.setDetail(xp.nextText());
}else if ("comment".equals(xp.getName())) {
news.setComment(xp.nextText());
}else if ("image".equals(xp.getName())) {
news.setimageUrl(xp.nextText());
}
break;
case XmlResourceParser.END_TAG:
if ("news".equals(xp.getName())) {
mNewsList.add(news);
news = null;
}
break;
default:
break;
}
eventType = xp.next();
}
Message msg = Message.obtain();
msg.what = SUCCESS;
mHandler.sendMessage(msg);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
③使用万能适配器将新闻数据显示在ListView上。
④添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
public class NewsAdapter extends CommonAdapter<News>{
public NewsAdapter(Context context, List<News> data, int layoutId) {
super(context, data, layoutId);
}
@Override
public void current(ViewHolder holder, Object object) {
News news = (News) object;
((TextView)holder.getView(R.id.tv_title)).setText(news.getTitle());
((TextView)holder.getView(R.id.tv_detail)).setText(news.getDetail());
((TextView)holder.getView(R.id.tv_comment)).setText(news.getComment() + "条评论");
((SmartImageView)holder.getView(R.id.siv)).setImageUrl(news.getimageUrl());
}
}
大家如果看了我前面的文章,这个新闻客户端应该就很简单了,如果有不懂,请看我前面的万能适配器、PULL解析的文章,我这里就不多说了。
源码下载:http://download.csdn.net