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 小实例应用的更多相关文章

  1. 一个简单的Android小实例

    原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台   3.安装J ...

  2. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

  3. Android进阶(二十三)Android开发过程之实例讲解

    Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话 ...

  4. python+pcap+dpkt 抓包小实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...

  5. winform 异步读取数据 小实例

    这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下. 主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入 ...

  6. CSS应用内容补充及小实例

    一.clear 清除浮动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  7. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. Objective-C之@类别小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  9. OC小实例关于init方法不小心的错误

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. 中国大学MOOC 玩转AutoCAD 熟悉AutoCAD的人机交互方式

  2. elasticsearch2.x插件之一:marvel(配置)

    Marvel是Elastic公司推出的商业监控方案,是用来监控Elasticsearch集群,历史状态的有力工具,便于性能优化以及故障诊断.监控主要分为六个层面,分别是集群层.节点层.索引层.分片层. ...

  3. TOP命令 详解CPU 查看多个核心的利用率按1

    top命令是linux下常用的工具,可以查看各个进程的CPU使用情况.先看一个实例: 这是Ramnode双核VPS的top显示结果: 左上角可以看到CPU的使用率是11.3%,但是看下面的进程,plu ...

  4. Hyperledger Fabric Ordering Service过程

    排序服务在超级账本 Fabric 网络中起到十分核心的作用.所有交易在发送给 Committer 进行验证接受之前,需要先经过排序服务进行全局排序. 在目前架构中,排序服务的功能被抽取出来,作为单独的 ...

  5. ZIP压缩格式与RAR压缩格式

    早已习惯了安装系统之后必须安装winrar,压缩文件也已经习惯了rar格式,这种习惯的力量真的挺可怕的.在工作中你的同事可能没有安装winrar,或者他们不喜欢安装盗版软件,这时候你给他们发送过去的是 ...

  6. 17.SQL 约束

    约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约束: NOT ...

  7. jqgrid控件列分组

    <%-- builed by manage.aspx.cmt [ver:2014.48.11] at 2014/10/11 16:48:33 --%> <%@ Page Langua ...

  8. Part8-不用内存怎么行_2440内存初始化lesson2

    1.2440地址空间 先去找PCB原理图,看CPU引出的内存地址线和数据线的宽度. 说明内存的其实地址是0x30000000为起始地址. 初始化内存其实是去初始化存储器控制器,只有初始化好这个存储器控 ...

  9. orcad找不到dll

    如果运行Capture.exe找不到cdn_sfl401as.dll,如果运行allegro.exe找不到cnlib.dll,(上面俩个库文件都在C:/Cadence/SPB_16.3/tools/b ...

  10. 递增三元数组——第九届蓝桥杯C语言B组(省赛)第六题

    原创 标题:递增三元组 给定三个整数数组A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN],请你统计有多少个三元组(i, ...