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; } ...
随机推荐
- Objects & Class
[Objects & Class] 1.定义一个类. 上述代码中,numberOfSides是实例变量,simpleDescription也是实例方法. 2.创建实例,使用实例. 3.init ...
- [luogu3369/bzoj3224]普通平衡树(splay模板、平衡树初探)
解题关键:splay模板题整理. 如何不加入极大极小值?(待思考) #include<cstdio> #include<cstring> #include<algorit ...
- Chrome,firefox,ie等浏览器空格 宽度不一样
方案一:使用其他字符代替空格 使用( :)空格浏览器之间,显示的不一样,对不齐等现象. 解决方案: 用半角空格&ensp:或者全角空格&emsp:就可以了,&e ...
- 使用Apache IO库操作IO与文件
--------------siwuxie095 首先到 Apache官网 下载相关的库文件 Apache官网:http://www.apach ...
- cocos2D-x demo 的源码分析 #define ..##.. 的妙用.
最近在看cocos2d-x 但不知道如何下手,于是先看一下他编译的完成的testcpp的源码.发现了下面一段程序 typedef CCLayer* (*NEWTESTFUNC)(); #define ...
- 283. Move Zeroes把零放在最后面
[抄题]: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...
- 36.LEN() 函数
LEN() 函数 LEN 函数返回文本字段中值的长度. SQL LEN() 语法 SELECT LEN(column_name) FROM table_name SQL LEN() 实例 我们拥有下面 ...
- Luogu 4159 [SCOI2009]迷路
BZOJ 1297 应当是简单题. 发现边权的数量很小,所以我们暴力把一个点拆成$9$个点,然后把$(x, i)$到$(x, i + 1)$连边,代表转移一次之后可以走回来:对于每一条存在的边$(i, ...
- c# 多维数组、交错数组(转化为DataTable)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- js实现选项卡切换
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...