案例--新闻客户端

来源:互联网 发布:全国冷藏车配货app软件 编辑:程序博客网 时间:2024/06/07 02:22

我们要完成这个案例,首先要知道开源项目AsyncHttpClient和SmartImageView:
(1)可以在https://github.com/loopj/android-async-http这个网址上下载AsyncHttpClient的jar包,将文件粘贴在工程目录的lib文件夹下,然后右击并依次选择Build Path→Add to Build Path就添加了关于AsyncHttpClient的jar包。
(2)在使用SmartImageView之前也需要下载SmartImageView的jar包,网址为:https://github.com/loopj/android-smart-image-view,添加支持与AsyncHttpClient相同。
现在就可以创建我们的项目了。

结果图:
这里写图片描述
1.创建一个名为“newWeb”的应用程序,程序对应的布局文件(activity_main.xml)代码如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"    android:orientation="vertical">    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <LinearLayout            android:id="@+id/loading"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:gravity="center"            android:orientation="vertical"            android:visibility="invisible">            <ProgressBar                android:layout_width="wrap_content"                android:layout_height="wrap_content" />            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="正在加载信息..." />        </LinearLayout>        <ListView            android:id="@+id/lv_news"            android:layout_width="match_parent"            android:layout_height="match_parent" />    </FrameLayout></LinearLayout>

2.创建ListView Item的布局,由于使用了ListView控件,所以要创建news_item.xml,代码如下:

<?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="65dp">    <com.loopj.android.image.SmartImageView        android:id="@+id/siv_icon"        android:layout_width="80dp"        android:layout_height="60dp"        android:scaleType="centerCrop"        android:src="@mipmap/ic_launcher"        android:layout_alignParentLeft="true"        android:layout_alignParentStart="true"></com.loopj.android.image.SmartImageView>    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="5dp"        android:layout_marginTop="10dp"        android:layout_toRightOf="@id/siv_icon"        android:ellipsize="end"        android:maxLength="20"        android:singleLine="true"        android:text="我是标题"        android:textColor="#000000"        android:textSize="18sp" />    <TextView        android:id="@+id/tv_description"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/tv_title"        android:layout_marginLeft="5dp"        android:layout_marginTop="5dp"        android:layout_toRightOf="@id/siv_icon"        android:ellipsize="end"        android:maxLength="16"        android:maxLines="1"        android:text="我是描述"        android:textColor="#99000000"        android:textSize="14sp" />    <TextView        android:id="@+id/tv_type"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_alignParentRight="true"        android:layout_marginBottom="5dp"        android:layout_marginRight="10dp"        android:text="评论"        android:textColor="#99000000"        android:textSize="12sp" /></RelativeLayout>

3.创建NewsInfo类
在适配ListView的Item布局是使用到了NewaInfo JavaBean对象。NewsInfo类代码如下:

package com.example.administrator.newweb.entity;/** * Created by Administrator on 2017/5/18. */public class NewsInfo {    private String iconPath;    private String title;    private String description;    private int type;    private long comment;    public long getComment() {        return comment;    }    public void setComment(long comment) {        this.comment = comment;    }    public String getIconPath() {        return iconPath;    }    public void setIconPath(String iconPath) {        this.iconPath = iconPath;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    public int getType() {        return type;    }    public void setType(int type) {        this.type = type;    }}

4.创建工具类解析xml文件,由于从服务器上获取得失一个xml文件,因此需要使用XmlPulParser对象解析出xml里面的内容并设置到相应的JavaBean中,NewsInfoService类代码如下:

package com.example.administrator.newweb.dao;import android.util.Xml;import com.example.administrator.newweb.entity.NewsInfo;import org.xmlpull.v1.XmlPullParser;import java.io.InputStream;import java.util.ArrayList;import java.util.List;/** * Created by 李小宁 on 2017/5/21. */public class NewsInfoService {    //解析服务器返回的xml信息,获取所有新闻数据实体    public static List<NewsInfo> getNewsInfos(InputStream is){        XmlPullParser parser=Xml.newPullParser();        try{            parser.setInput(is,"utf-8");            //获取指针            int type=parser.getEventType();            List<NewsInfo> newsInfos=null;            NewsInfo newsInfo=null;            //type不是文档结束            while(type!=XmlPullParser.END_DOCUMENT){                switch(type){                    case XmlPullParser.START_TAG:                        //拿到标签名并判断                        if("news".equals(parser.getName())){                            newsInfos=new ArrayList<NewsInfo>();                        }else if("newsInfo".equals(parser.getName())){                            newsInfo=new NewsInfo();                        }else if("icon".equals(parser.getName())){                            //获取解析器当前元素的下一个文本节点的值                            String icon=parser.nextText();                            newsInfo.setIconPath(icon);                        }else if("title".equals(parser.getName())){                            String title=parser.nextText();                            newsInfo.setTitle(title);                        }else if("content".equals(parser.getName())){                            String description=parser.nextText();                            newsInfo.setDescription(description);                        }else if("type".equals(parser.getName())){                            String newsType=parser.nextText();                            newsInfo.setType(Integer.parseInt(newsType));                        }else if("comment".equals(parser.getName())){                            String comment=parser.nextText();                            newsInfo.setComment(Long.parseLong(comment));                        }                        break;                    case XmlPullParser.END_TAG:                        if("newsInfo".equals(parser.getName())){                            newsInfos.add(newsInfo);                            newsInfo=null;                        }                        break;                }                type=parser.next();            }            System.out.println(newsInfos+"00");            return newsInfos;        }catch(Exception e)        {            e.printStackTrace();            System.out.println("123457789");            return null;        }    }}

5.编写界面交互代码(MainActivity):

package com.example.administrator.newweb;import android.graphics.Color;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.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import com.example.administrator.newweb.dao.NewsInfoService;import com.example.administrator.newweb.entity.NewsInfo;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.AsyncHttpResponseHandler;import com.loopj.android.image.SmartImageView;import java.io.ByteArrayInputStream;import java.util.List;public class MainActivity extends AppCompatActivity {    private ListView lv_news;    private LinearLayout loading;    private List<NewsInfo> newsInfos;    //ListView适配    private class NewsAdapter extends BaseAdapter{        @Override        public int getCount() {            return newsInfos.size();        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view=View.inflate(MainActivity.this,R.layout.news_item,null);            SmartImageView siv=(SmartImageView)view.findViewById(R.id.siv_icon);            TextView tv_title= (TextView)view.findViewById(R.id.tv_title);            TextView tv_description= (TextView)view.findViewById(R.id.tv_description);            TextView tv_type= (TextView)view.findViewById(R.id.tv_type);            NewsInfo newsInfo =newsInfos.get(position);            //SmartImageView加载指定路径图片            siv.setImageUrl(newsInfo.getIconPath(),R.drawable.a,R.mipmap.ic_launcher);            //设置新闻标题            tv_title.setText(newsInfo.getTitle());           //设置新闻描述            tv_description.setText(newsInfo.getDescription());            int type=newsInfo.getType();  //1.一般新闻2.专题3.live            //不同新闻类型设置不同的颜色和不同的内容            switch (type){                case 1:                    tv_type.setText("评论:"+newsInfo.getComment());                    break;                case 2:                    tv_type.setTextColor(Color.RED);                    tv_type.setText("专题");                    break;                case 3:                    tv_type.setTextColor(Color.BLUE);                    tv_type.setText("LIVE");                    break;            }            return view;        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        lv_news=(ListView)findViewById(R.id.lv_news);        loading= (LinearLayout) findViewById(R.id.loading);        fillData2();    }  //使用AsyncHttpClient访问网络    private void fillData2() {        //创建AsyncHttpClient实例        AsyncHttpClient asyncHttpClient=new AsyncHttpClient();        //使用GET方法请求        asyncHttpClient.get(getString(R.string.serverurl),new AsyncHttpResponseHandler(){            public  void onSuccess(String content){                //访问成功                super.onSuccess(content);                //将字符串转换成Byte数组                byte[] bytes=content.getBytes();                //将Byte数组转成输入流                ByteArrayInputStream bais=new ByteArrayInputStream(bytes);                //调用NewsInfoService工具类解析xml文件                newsInfos= NewsInfoService.getNewsInfos(bais);                if(newsInfos==null){                    //解析失败  弹出toast                    Toast.makeText(MainActivity.this,newsInfos+"",Toast.LENGTH_LONG).show();                }else{                    //更新界面                    loading.setVisibility(View.INVISIBLE);                    lv_news.setAdapter(new NewsAdapter());                }            }            //请求失败            public void onFailure(Throwable error,String content){                super.onFailure(error,content);                Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();            }        });    }}

6.配置服务器
由于需要从服务器上下载一个XML,因此需要开启tomcat服务器在tomcat根目录下找到bin文件夹,运行该文件夹下的startup.bat文件即可开启tomcat服务器。然后,在tomcat的安装目录打开webapps文件夹,将NewInfo.xml文件放置在ROOT文件夹下。NewInfo.xml代码如下:

<?xml version="1.0" encoding="utf-8"?><news>    <newsInfo>        <icon>http://10.3.6.177:8080/images/a.PNG</icon>        <title>科技改变世界</title>        <content>进入一个更有爱的领域</content>        <type>1</type>        <comment>69</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/b.PNG</icon>        <title>《神武》</title>        <content>新美术资源盘点,视觉新体验</content>        <type>2</type>        <comment>35</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/c.PNG</icon>        <title>南北车正式公布合并</title>        <content>南北车将于今日正式公布合并</content>        <type>3</type>        <comment>2</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/d.PNG</icon>        <title>萌呆了!汪星人抱玩偶酣睡</title>        <content>汪星人抱玩偶酣睡,萌翻网友</content>        <type>1</type>        <comment>25</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/e.PNG</icon>        <title>风力发电进校园</title>        <content>风力发电普进校园</content>        <type>2</type>        <comment>26</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/f.PNG</icon>        <title>地球一小时</title>        <content>地球熄灯一小时</content>        <type>1</type>        <comment>23</comment>    </newsInfo>    <newsInfo>        <icon>http://10.3.6.177:8080/images/g.PNG</icon>        <title>最美公路</title>        <content>最美公路,难以想象</content>        <type>1</type>        <comment>23</comment>    </newsInfo></news>