Android newsClient 小实例应用
1.newsClient新闻客户端涉及知识点汇总:
(1)ListView(用来显示消息)
(2)开子线程去服务器取数据
(3)解析xml文件
(4)利用handler或者runOnUiThread(new Runnable(){})更新ui组件。
(5)设置ListView的数据适配器MyAdapter(继承BaseAdapter)
(6)开源项目SmartImageView的使用
(7)tomcat服务器的搭建(此项目在运行之前一定会开启服务器)
(8)在Manifest文件中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2.项目源码
<1>xml布局文件
(1)MainActivity.class的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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_news"
android:layout_width="match_parent"
android:layout_height="match_parent"> </ListView> </LinearLayout>
(2)ListView组件的item布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="80dp"> <com.loopj.android.image.SmartImageView
android:id="@+id/iv_icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/ic_launcher" /> <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:layout_toRightOf="@+id/iv_icon"
android:textSize="22dp"
android:textColor="#000000"
android:text="TextView" /> <TextView
android:id="@+id/tv_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:layout_toRightOf="@+id/iv_icon"
android:layout_below="@+id/tv_title"
android:textSize="18dp"
android:textColor="#000000"
android:text="TextView11111111111111111111111111111111111111111111111" /> <TextView
android:id="@+id/tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textSize="14sp"
android:layout_alignBottom="@+id/iv_icon"
android:text="TextView" /> </RelativeLayout>
注意:
ListView的item采用相对布局
android:singleLine="true" //这句设置textview组件只显示单行
android:maxLines="2" //这句设置textview组件最多显示的行数
android:layout_toRightOf="@+id/iv_icon" //设置该组件在iv_icon组件的右边
android:layout_below="@+id/tv_title" //设置该组件在tv_title组件的下边
android:layout_alignParentRight="true" --将控件的右边缘和父控件的右边缘对齐
<2>java后台代码
(1)MainActivity.java
package com.example.lucky.test55newsclient1; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView; import com.loopj.android.image.SmartImageView; import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List; public class MainActivity extends AppCompatActivity {
ListView lv_news;
List<News> newsLists;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_news=findViewById(R.id.lv_news);
//准备lv_news需要显示的数据,从服务器中获取数据,进行封装
initListData(); } //准备lv_news需要显示的数据
private void initListData() {
new Thread(){
@Override
public void run() {
try {
//0.去服务器取数据 http://192.168.1.142:8080/news.xml
//1.创建URL,指定我们要访问的网址
String path="http://192.168.1.142:8080/news.xml";
URL url=new URL(path);
//2.获取HttpURLConnection对象,用于发送或接收数据
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
System.out.println("-------------------flaglucky");
//3.设置请求格式为get
conn.setRequestMethod("GET"); //注意get要求大写,默认为get请求
//4.设置请求的超时时间
conn.setConnectTimeout(5000);
//5.获取服务器返回的状态码
int code=conn.getResponseCode();
System.out.println("--------------"+code);
//如果code==200说明请求成功
if(code==200) {
System.out.println("-------------------flagif");
//6.获取服务器返回的数据(以流的形式返回)
InputStream in = conn.getInputStream();
//7.解析xml
newsLists= XmlParserUtils.parserXml(in);
runOnUiThread(new Runnable() {
@Override
public void run() {
//更新ui,将数据显示到listview中
lv_news.setAdapter(new MyAdapter());
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
} //设置数据适配器
private class MyAdapter extends BaseAdapter{ @Override
public int getCount() {
return newsLists.size();
} @Override
public Object getItem(int i) {
return null;
} @Override
public long getItemId(int i) {
return 0;
} @Override
public View getView(int i, View view, ViewGroup viewGroup) {
View viewshow;
if(view==null){
viewshow=View.inflate(getApplicationContext(),R.layout.items,null);
}else {
viewshow=view;
}
//1.找到控件
SmartImageView iv_icon=viewshow.findViewById(R.id.iv_icon);
TextView tv_title=viewshow.findViewById(R.id.tv_title);
TextView tv_detail=viewshow.findViewById(R.id.tv_detail);
//2.显示数据
tv_title.setText(newsLists.get(i).getTitle());
tv_detail.setText(newsLists.get(i).getDetail());
String imageUrl=newsLists.get(i).getImage();
iv_icon.setImageUrl(imageUrl);
return viewshow;
}
}
}
(2)javabean(News.java)
package com.example.lucky.test55newsclient1;
public class News {
private String title;
private String detail;
private String comment;
private String image;
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 getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
(3)XmlParserUtils工具类
package com.example.lucky.test55newsclient1; import android.util.Xml; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; public class XmlParserUtils {
public static List<News> parserXml(InputStream in) throws Exception {
List<News> newslists=null;
News news=null;
//1.获取xml解析器
XmlPullParser parser=Xml.newPullParser();
//2.设置解析器要解析的内容
parser.setInput(in,"utf-8");
//3.获取解析的事件类型
int type=parser.getEventType();
//4.不停的向下解析
while (type!=XmlPullParser.END_DOCUMENT){
switch (type){
case XmlPullParser.START_TAG: //解析开始节点
//5.判断正在解析的是哪个标签
if("newslist".equals(parser.getName())){
//6.创建一个list集合
newslists=new ArrayList<>();
}else if("news".equals(parser.getName())){
news=new News();
}else if("title".equals(parser.getName())){
news.setTitle(parser.nextText());
}else if("detail".equals(parser.getName())){
news.setDetail(parser.nextText());
}else if("comment".equals(parser.getName())){
news.setComment(parser.nextText());
}else if("image".equals(parser.getName())){
news.setImage(parser.nextText());
}
break;
case XmlPullParser.END_TAG: //解析结束节点
if("news".equals(parser.getName())){
//把javabean添加到集合
newslists.add(news);
}
System.out.println("-----------------2019/3/31");
break;
}
//不停的向下解析
type=parser.next();
}
return newslists;
}
}
(4)SmartImageView的使用
将开源项目解压放入项目中

调用即可。
3.项目效果图

Android newsClient 小实例应用的更多相关文章
- 一个简单的Android小实例
原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台 3.安装J ...
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...
- Android进阶(二十三)Android开发过程之实例讲解
Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话 ...
- python+pcap+dpkt 抓包小实例
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...
- winform 异步读取数据 小实例
这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下. 主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入 ...
- CSS应用内容补充及小实例
一.clear 清除浮动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Objective-C之代理设计模式小实例
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Objective-C之@类别小实例
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- OC小实例关于init方法不小心的错误
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- 【HDU5857】Median
题意 给出一个长度为n的有序序列.给出m个询问,每个询问包括四个正整数l1,r1,l2,r2你用l1tor1的和l2tor2的元素来组成一个新的序列,然后找出这个序列的中位数. 分析 这是当时Spri ...
- laravel使用ORM操作数据库
laravel使用ORM操作数据库 public function mode(){ //查询所有 $isok=Student::get(); 新增. (1) $isok=Student::create ...
- ./run.sh --indir examples/demo/ --outdir examples/results/ --vis
(AlphaPose20180911) luo@luo-ThinkPad-W540:AlphaPose$ ./run.sh --indir examples/demo/ --outdir exampl ...
- JSTL标签之core标签的使用
参考:http://blog.csdn.net/qq_25827845/article/details/53311722 核心标签库的导入 <%@ taglib prefix="c&q ...
- R dataframe 遗忘, which 矩阵搜索
A data frame is used for storing data tables. It is a list of vectors of equal length. For example, ...
- POJ3295 Tautology(栈+枚举)
Description WFF 'N PROOF is a logic game played with dice. Each die has six faces representing some ...
- EBS取Web字段SQL操作文档
1) 安全性—>责任-à定义 在这个路径下,输入责任名称,可以查询这个责任的请求组的名称 2) organization_id 和 org_id的功能 3) 查找网页上的字段 Naviga ...
- FileUtils 文件下载 文件导出
public class FileUtils { /// <summary> /// 文件下载 /// </summary> /// <param name=" ...
- 初学reactNative遇到的问题总结
1.undefined is not an object (evaluating '_react3.default.PropTypes.shape') Navigator已经不再react nativ ...
- 让IE播放PPT
在win7下安装office 2003,想让ppt在ie里播放,然后供winform调用,显示并播放ppt,操作如下 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Power ...