android之简易新闻客户端

Posted 被罚站的树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android之简易新闻客户端相关的知识,希望对你有一定的参考价值。

将一个新闻信息保存到一个XML文件中,并将放在服务器下。通过手机客户端来从服务器下载该文件并解析显示。

news.xml


 

<?xml version="1.0" encoding="UTF-8" ?>
<newslist>
    <news>
        <title>黑马52期就业快报</title>
        <detail>热烈祝贺黑马52期平均薪水突破13k</detail>
        <comment>15687</comment>
        <image>http://192.168.0.109/images/6.jpg</image>
    </news>
    <news>
        <title>程序员因写代码太乱被杀害</title>
        <detail>凶手是死者同事,维护死者代码时完全看不懂而痛下杀手</detail>
        <comment>16359</comment>
        <image>http://192.168.0.109/images/7.jpg</image>
    </news>
    <news>
        <title>3Q大战宣判: 腾讯获赔500万</title>
        <detail>最高法驳回360上诉, 维持一审宣判.</detail>
        <comment>6427</comment>
        <image>http://192.168.0.109/images/1.jpg</image>
    </news>
    <news>
        <title>今日之声:北大雕塑被戴口罩</title>
        <detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
        <comment>681</comment>
        <image>http://192.168.0.109/images/2.jpg</image>
    </news>
    <news>
        <title>轻松一刻: 我要沉迷学习不自拔</title>
        <detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
        <comment>11616</comment>
        <image>http://192.168.0.109/images/4.jpg</image>
    </news>
    <news>
        <title>男女那些事儿</title>
        <detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
        <comment>10339</comment>
        <image>http://192.168.0.109/images/5.jpg</image>
    </news>
    <news>
        <title>赵帅哥语录一</title>
        <detail>少壮不努力,老大做IT</detail>
        <comment>14612</comment>
        <image>http://192.168.0.109/images/8.jpg</image>
    </news>
    <news>
        <title>奥巴马见达是装蒜</title>
        <detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
        <comment>1359</comment>
        <image>http://192.168.0.109/images/3.jpg</image>
    </news>
</newslist>
View Code

新闻信息以XML方式进行保存,文件的编码是UTF-8。文件中的IP地址是自己服务器地址,图片需要自己准备。

布局文件


 

子布局文件item_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context="xidian.dy.com.chujia.MainActivity">

    <com.loopj.android.image.SmartImageandroid:id="@+id/img"
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:src="@drawable/dog"
        android:layout_centerVertical="true"
        />
    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="小狗"
        android:textSize="22sp"
        android:layout_toRightOf="@+id/img"
        />
    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是一条小狗"
        android:layout_below="@+id/title"
        android:layout_alignLeft="@+id/title"
        android:lines="2"
        android:textColor="@android:color/darker_gray"
        android:textSize="15sp"
        />
    <TextView
        android:id="@+id/comment"
        android:layout_width="wrap_content"
        android:layout_below="@+id/content"
        android:layout_height="wrap_content"
        android:text="1223条评论"
        android:textColor="#ff0000"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

 

 

主布局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"
    android:orientation="vertical"
    tools:context="xidian.dy.com.chujia.MainActivity">

        <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
</LinearLayout>

 java代码


 

javabean 

package xidian.dy.com.chujia;

/**
 * Created by dy on 2016/6/25.
 */
public class NewsBean {
    private String title;
    private String content;
    private String commnets;
    private String imgUrl;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getCommnets() {
        return commnets;
    }

    public void setCommnets(String commnets) {
        this.commnets = commnets;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }
}

 

MainActivity.java 

package xidian.dy.com.chujia;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.loopj.android.image.SmartImageView;

import org.xmlpull.v1.XmlPullParser;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<NewsBean> list;
    Handler handler = new Handler(){
        //主线程从list中获取新闻内容
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 0){
                ListView lv = (ListView) findViewById(R.id.lv);
                if(lv != null){
                    lv.setAdapter(new MyAdapter());
                }
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getNewsFromNet();
    }

    private void getNewsFromNet(){
        list = new ArrayList<>();
        new Thread(new Runnable() {
            NewsBean news;
            @Override
            public void run() {
                try {
                    //从获取新闻内容,传输格式的XML
                    //通过PULL模式解析XML文件并将其封装为javabean保存到List中
                    URL url = new URL("http://192.168.0.109/news.xml");
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);
                    conn.connect();
                    if(conn.getResponseCode() == 200){
                        InputStream is = conn.getInputStream();
                        XmlPullParser xmlPull = Xml.newPullParser();
                        xmlPull.setInput(is,"utf-8");
                        while (xmlPull.getEventType() != XmlPullParser.END_DOCUMENT){
                            if(xmlPull.getEventType() == XmlPullParser.START_TAG)
                                if(xmlPull.getName().equals("news"))
                                    news = new NewsBean();
                                else if(xmlPull.getName().equals("title")){
                                    news.setTitle(xmlPull.nextText());}
                                else if(xmlPull.getName().equals("detail"))
                                    news.setContent(xmlPull.nextText());
                                else if(xmlPull.getName().equals("comment"))
                                    news.setCommnets(xmlPull.nextText());
                                else if(xmlPull.getName().equals("image")){
                                    news.setImgUrl(xmlPull.nextText());
                                }
                            if(xmlPull.getEventType() == XmlPullParser.END_TAG && xmlPull.getName().equals("news"))
                                list.add(news);
                            xmlPull.next();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //解析完毕向主线程发送消息
                handler.sendEmptyMessage(0);
            }
        }).start();
    }

    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return list.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) {
            NewsBean news = list.get(position);
            ViewHolder vh;
            View v;
            if(convertView == null){
                //将一个布局文件转为一个View对象
                v = View.inflate(MainActivity.this, R.layout.item_list, null);
                SmartImageView siv = (SmartImageView) v.findViewById(R.id.img);
                TextView tv1 = (TextView) v.findViewById(R.id.title);
                TextView tv2 = (TextView) v.findViewById(R.id.content);
                TextView tv3 = (TextView) v.findViewById(R.id.comment);
                vh = new ViewHolder();
                vh.siv = siv;
                vh.tvTitle = tv1;
                vh.tvContent = tv2;
                vh.tvComment = tv3;
                //为v添加附带信息,方便下次使用
                v.setTag(vh);
            }
            else{
                //使用缓存中的View对象,避免重新创建
                v = convertView;
                vh = (ViewHolder) v.getTag();
            }

            if(vh.siv != null)
                vh.siv.setImageUrl(news.getImgUrl());
            if(vh.tvTitle != null)
                vh.tvTitle.setText(news.getTitle());
            if(vh.tvContent != null)
                vh.tvContent.setText(news.getContent());
            if(vh.tvComment != null)
                vh.tvComment.setText(news.getCommnets());
            return v;
        }

        class ViewHolder{
            public SmartImageView siv;
            public TextView tvTitle;
            public TextView tvContent;
            public TextView tvComment;
        }
    }
}

 

 效果展示


在代码中引入了第三方代码android-smart-image-view

以上是关于android之简易新闻客户端的主要内容,如果未能解决你的问题,请参考以下文章

Android第一行代码之制作简易版新闻应用

Android高仿网易新闻客户端之侧滑菜单

如何做一个简易的新闻客户端

Android实践之简易天气

android新闻客户端是怎么得到新闻的?

android 新闻客户端怎么实现