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; } ...
随机推荐
- Mediator模式
[Mediator模式] 通过mediator来让各个相互通知的对象解耦.在iOS框架中就是NSNotificationCenter. 参考:http://www.jdon.com/designpat ...
- tomcat配置多个host
当一个tomcat需要配多个应用时,并且内网和外网的访问IP还不一样,就需要使用到tomcat配置多个虚拟主机. <Host name="localhost" appBas ...
- 值得一做》一道类似于货车运输的题目(BZOJ3732)(easy+)
这是一道模板套模板的题目,只要会LCA和最小生成树就可以做,水题 直接先甩题目 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条 ...
- 【CF#338D】GCD Table
[题目描述] 有一张N,M<=10^12的表格,i行j列的元素是gcd(i,j) 读入一个长度不超过10^4,元素不超过10^12的序列a[1..k],问是否在某一行中出现过 [题解] 要保证g ...
- eclipse检测不到android的手机
eclipse检测不到android设备我们一般重启adb server但是一般不管用,下面是重启adb server adb kill-server 可能出现“服务没有运行”的提示信息如下: * s ...
- 408. Valid Word Abbreviation有效的单词缩写
[抄题]: Given a non-empty string s and an abbreviation abbr, return whether the string matches with th ...
- Debian上SCST的设置
一)创建SCST,无infiniband支持 1:载入最小化支持 #aptitude install build-essentials linux-headers checkinstall #wget ...
- Laravel Gate 授权方式的使用指南
参考链接:An Introduction to Laravel Authorization Gates 本文使用 Laravel 的 Gate 授权方式 实现一个基于用户角色的博客发布系统. 在系统包 ...
- 编写高质量代码改善C#程序的157个建议——建议33:避免在泛型类型中声明静态成员
建议33:避免在泛型类型中声明静态成员 在上一建议中,已经理解了应该将MyList<int>和MyList<string>视作两个完全不同的类型,所以,不应该将MyList&l ...
- WOX快速搜索
WOX wox和mac上的Aflred类似,虽然在功能上稍有逊色,但是还是可以给我们使用windows电脑带来很多福利.首先你不需要在桌面放一堆应用软件的快捷方式,桌面可以非常干净整洁,想要打开某个应 ...