android 学习随笔九(网络:简单新闻客户端实现)
1、简单新闻客户端
<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"
tools:context=".MainActivity" > <ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/> </RelativeLayout>
android:singleLine="true" textview设置了此属性表示只显示一行,会自动增加...
android:lines="2" 只显示2行,多余的文字被截取。
<?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="wrap_content" > <com.loopj.android.image.SmartImageView
android:id="@+id/siv"
android:layout_width="90dp"
android:layout_height="70dp"
android:src="@drawable/ic_launcher"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="标题阿克江还得靠就阿訇多空间阿红的卡口"
android:textSize="18sp"
android:layout_toRightOf="@id/siv"
android:singleLine="true"
/>
<TextView
android:id="@+id/tv_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="详细阿红的卡上的空间阿红的科技爱好是三路口见大口径的空间啊顺丰的会计师费空间是否会计师"
android:textColor="@android:color/darker_gray"
android:textSize="15sp"
android:layout_below="@id/tv_title"
android:layout_toRightOf="@id/siv"
android:lines="2"
/>
<TextView
android:id="@+id/tv_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="12323评论"
android:textColor="#ff0000"
android:layout_alignParentRight="true"
android:layout_below="@id/tv_detail"
/>
</RelativeLayout>
package com.itheima.mrsbsclient.domain; public class News { private String title;
private String detail;
private String comment;
private String imageUrl;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
@Override
public String toString() {
return "News [title=" + title + ", detail=" + detail + ", comment="
+ comment + ", imageUrl=" + imageUrl + "]";
} }
package com.itheima.mrsbsclient; import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import com.itheima.mrsbsclient.domain.News;
import com.loopj.android.image.SmartImageView; import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity { List<News> newsList; Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); getNewsInfo(); // ListView lv = (ListView) findViewById(R.id.lv);
//此时新闻信息还没有解析完毕,newsList还没有new出来
// lv.setAdapter(new MyAdapter());
} class MyAdapter extends BaseAdapter{
//返回的要显示的条目的数量
@Override
public int getCount() {
// TODO Auto-generated method stub
return newsList.size();
} //返回一个View对象,会作为ListView的一个条目显示在界面上
// 当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是 //传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
@Override
public View getView(int position, View convertView, ViewGroup parent) {
News news = newsList.get(position); View v = null;
ViewHolder mHolder = null;
if(convertView == null){
//如何填充的
v = View.inflate(MainActivity.this, R.layout.item_listview, null); //创建viewHoler封装所有条目使用的组件,不能在此赋值因为只要内存中有条目缓存,在新的条目出现时,就会使用缓存,所以每次要重新设置 //条目的值
mHolder = new ViewHolder();
mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title);
mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
mHolder.siv = (SmartImageView) v.findViewById(R.id.siv); //把viewHolder封装至view对象中,这样view被缓存时,viewHolder也就被缓存了
v.setTag(mHolder);
}
else{
v = convertView;
//从view中取出保存的viewHolder,viewHolder中就有所有的组件对象,不需要再去findViewById
mHolder = (ViewHolder) v.getTag();
}
//给条目中的每个组件设置要显示的内容
mHolder.tv_title.setText(news.getTitle());
mHolder.tv_detail.setText(news.getDetail());
mHolder.tv_comment.setText(news.getComment() + "条评论"); mHolder.siv.setImageUrl(news.getImageUrl());
return v;
} //把条目需要使用到的所有组件封装在这个类中
class ViewHolder{
TextView tv_title;
TextView tv_detail;
TextView tv_comment;
SmartImageView siv;
} @Override
public Object getItem(int position) {
return newsList.get(position);
} @Override
public long getItemId(int position) {
return position;
} } private void getNewsInfo() {
Thread t = new Thread(){
@Override
public void run() {
String path = "http://169.254.244.136:8080/news.xml";
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8000);
conn.setReadTimeout(8000); if(conn.getResponseCode() == 200){
//流里的信息是一个xml文件的文本信息,用xml解析器去解析,而不要作为文本去解析
InputStream is = conn.getInputStream();
getNewsFromStream(is); }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t.start();
} private void getNewsFromStream(InputStream is) {
//从XML对象中获取XML文件解析器对象。
XmlPullParser xp = Xml.newPullParser();
try {
xp.setInput(is, "utf-8"); //获取事件类型,通过事件类型判断出当前解析的是和什么节点
int type = xp.getEventType(); News news = null;
while(type != XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
if("newslist".equals(xp.getName())){
newsList = new ArrayList<News>();
}
else if("news".equals(xp.getName())){
news = new News();
}
else if("title".equals(xp.getName())){
String title = xp.nextText();
news.setTitle(title);
}
else if("detail".equals(xp.getName())){
String detail = xp.nextText();
news.setDetail(detail);
}
else if("comment".equals(xp.getName())){
String comment = xp.nextText();
news.setComment(comment);
}
else if("image".equals(xp.getName())){
String image = xp.nextText();
news.setImageUrl(image);
} break;
case XmlPullParser.END_TAG:
if("news".equals(xp.getName())){
newsList.add(news);
}
break; }
//指针移动到下一个节点并返回事件类型
type = xp.next();
} //发送消息,让主线程刷新listview
handler.sendEmptyMessage(1);
// for (News n : newsList) {
// System.out.println(n.toString());
// }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
android 学习随笔九(网络:简单新闻客户端实现)的更多相关文章
- android 学习随笔六(网络要求及配置)
android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程 只有主线程才能修改UI ANR异常:Applicat ...
- android 学习随笔七(网络:图片及文本传输及线程关系 )
主线程.子线程.UI的关系 简单的HTTP请求 -------------------------------------------------------- public class MainAc ...
- android 学习随笔十一(网络:HttpClient框架)
1.使用HttpClient框架发送get.post请求 google收集apache提供的一个发送Http请求框架 public class Tools { public static String ...
- android 学习随笔十(网络:get、post提交数据)
1.get public class Tools { public static String getTextFromStream(InputStream is){ byte[] b = new by ...
- Netty学习——基于netty实现简单的客户端聊天小程序
Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...
- [Android] Android 手机下 仿 今日头条 新闻客户端
利用一个月的时间,自学了 Android 开发 ,为了检验学习成果,特意 开发了这个 仿 今日头条 新闻客户端 AppNews 包括图文新闻+视频新闻+图片新闻 预览演示如下: 功能说明: 1)底部 ...
- Android学习随笔--ListView的分页功能
第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...
- Android学习总结——判断网络状态
package com.example.xch.broadcasttest; import android.content.BroadcastReceiver; import android.cont ...
- android 项目学习随笔九(ListView加头布局)
1.缓冲背景色 <ListView android:id="@+id/lv_list" android:layout_width="match_parent&quo ...
随机推荐
- js基础的总结
js中的每个函数都含有一个内建的arguments数组,能够返回函数接受的所有参数,不管函数有没有定义参数. function add() { var sum = 0; for (var i = 0; ...
- APICloud携技术入滇 助力互联网创业
在<相比北上广二三线城市创业有哪些优势? >一文中,小编深入探讨了目前二三线城市在互联网行业发展的现状,城市间的消费错位导致了二三线城市具有大规模的消费能力,促使互联网行业的逐步崛起.我们 ...
- 磁盘空间已满导致rabbitmq无法启动
rabbitmq-server 启动问题 今天遇到一个挺奇怪的 rabbitmq-server 的启动问题. 在内部使用的 openstack 环境上,rabbitmq-server突然就关掉了,无法 ...
- [BS] 小知识点总结-05
[BS] 小知识点总结-05 1. 不论UIWindow的rootViewController是navC.tabBarC还是VC,也不管modalVC和rootVC中间隔着多少个VC,但是modal出 ...
- C#通过存储过程进行查询
一直不确定C#可以通过存储过程进行查询,今天才确定是可以的. 可以返回DataReader或者Dataset.
- ISymbol
public void Draw (IGeometry Geometry); public void QueryBoundary ( int hDC, ITransformation ...
- 一个四叉树Demo学习
程序代码: http://www.codeproject.com/Articles/30535/A-Simple-QuadTree-Implementation-in-C 四叉树: using Sys ...
- PostgreSQL 对字段大小写敏感
缘起 iso=> \d+ test; Table "public.test" Column | Type | Modifiers | Storage | Descriptio ...
- Basic认证
Basic 概述 Basic 认证是HTTP 中非常简单的认证方式,因为简单,所以不是很安全,不过仍然非常常用. 当一个客户端向一个需要认证的HTTP服务器进行数据请求时,如果之前没有认证过,HTTP ...
- Oracle忽略hint的几种情形
1.hint有语法错误.拼写错误 2.hint无效.比如索引不存在.非等值查询使用hash hint等 3.多个hint之间自相矛盾 4.hint受到了查询转换的影响 5.hint受到了数据库保留字的 ...