文档章节

android新闻端demo

A
 Angels_安杰
发布于 2015/10/08 08:25
字数 1195
阅读 317
收藏 3

学习了有一个多星期的android了,今天跟着视频来个小案例练习下,在这里记录下:

开发软件 android studio 

第一步:先在activity_main.xml文件中写布局代码,这里用一个listview来展示每一条新闻

<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="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

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

   </ListView>




</RelativeLayout>

知识点补充:

fill_parent

设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。

 wrap_content

设置一个视图的尺寸为wrap_content将强制性地使视图扩展以显示全部内容。

match_parent
   level8开始fill_parent替换为match_parent,match_parent和fill_parent是一个意思 .两个参数意思一样

tools:context=".MainActivity">

表示,该布局配置文件的使用环境上下文为

MainActivity

这个类

第二步:为每一个新闻项自定义一个布局文件

<?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="wrap_content"
   android:padding="5dp"
   >

   <com.loopj.android.image.SmartImageView
       android:id="@+id/siv_listvie_item_icon"
       android:layout_width="100dip"
       android:layout_height="60dip"
       android:src="@drawable/a2"
      />
   <TextView
       android:id="@+id/tv_listview_item_title"
       android:layout_toRightOf="@id/siv_listvie_item_icon"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:singleLine="true"
       android:text="3Q大战宣判:腾讯获赔500"
       android:textColor="@android:color/black"
       android:textSize="17sp"/>
   <TextView
       android:id="@+id/tv_listview_item_detail"
       android:layout_alignLeft="@id/tv_listview_item_title"
       android:layout_below="@id/tv_listview_item_title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="sdjsahdkjsahdkjsadhjksahdkj"
       android:textColor="@android:color/darker_gray"
       android:textSize="14sp"/>
   <TextView
       android:id="@+id/tv_listview_item_comment"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentRight="true"
       android:layout_alignParentBottom="true"
       android:text="668跟帖"
       android:textColor="@android:color/darker_gray"
       android:textSize="14sp"/>
</RelativeLayout>

第三步:开始编写逻辑文件

package com.zaizai.news;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.image.SmartImageView;
import com.zaizai.news.domain.NewsInfo;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private final int SUCCESS = 0;
    private final int FAILED = 1;
    private ListView lvNews = null;
    private List<NewsInfo> list = null;
    private Handler handler = new Handler() {
        /*接受消息*/
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SUCCESS: //访问成功
                    /*将数据绑定到listView中*/
                   list = (List<NewsInfo>) msg.obj;
                    MyAdaper myAdaper = new MyAdaper();
                    lvNews.setAdapter(myAdaper);
                    break;
                case FAILED://访问失败
                    Toast.makeText(MainActivity.this,"当前网络崩溃了",Toast.LENGTH_LONG).show();
                    break;
                default:
                    break;
            }
            super.handleMessage(msg);
        }
    };


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

        init();
    }

    private void init() {
         lvNews = (ListView) findViewById(R.id.lv_news);
        //抓取新闻数据
        /*创建一个线程进行数据下载*/
        new Thread(new Runnable() {
            /*子线程不能修改UI界面的状态,可通过hander*/
            @Override
            public void run() {
                /*获得新闻信息集合*/
                List<NewsInfo> newInfList = getNewsFromInternet();
                /*newInflist==NUll时*/
                Message message = new Message();
                if (newInfList != null) {
                    message.what = SUCCESS;
                    message.obj = newInfList;
                } else {
                    message.what = FAILED;
                }

                handler.sendMessage(message);
            }
        }).start();
        //绑定数据

    }

    /**
     * 返回新闻信息
     */
    private List<NewsInfo> getNewsFromInternet() {
        HttpClient httpclient = null;

        try {
             /*定义一个httpClient客户端*/
            httpclient = new DefaultHttpClient();
            /*定义get方法*/
            HttpGet get = new HttpGet("http://192.168.9.1:8080/new.xml");
            /*执行请求方法*/
            HttpResponse httpResponse = httpclient.execute(get);
            int statusCode = httpResponse.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                InputStream inputStream = httpResponse.getEntity().getContent();
                List<NewsInfo> newsInfos = getNewsListFromInputStream(inputStream);
                return newsInfos;
            } else {
                Log.i(TAG, "访问失败:" + statusCode);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (httpclient != null) {
                /*关闭可释放资源*/
                httpclient.getConnectionManager().shutdown();
            }
        }
        return null;
    }

    /**
     * 从inputStream流中解析newlist
     *
     * @param is
     * @return
     */
    private List<NewsInfo> getNewsListFromInputStream(InputStream is) throws Exception {

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//创建一个xmlpull解析器的工厂
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(is, "UTF-8");
        int eventType = parser.getEventType();
        List<NewsInfo> infoList = null;
        NewsInfo newsInfo = null;
        while (eventType != XmlPullParser.END_DOCUMENT) {
            /*当未解析到文档的结尾处时*/
            String tagName = parser.getName();//获得节点名称

            switch (eventType) {
                case XmlPullParser.START_TAG: //<news>
                    if ("news".equals(tagName)) {
                        infoList = new ArrayList<NewsInfo>();
                    } else if ("new".equals(tagName)) {
                        newsInfo = new NewsInfo();
                    } else if ("title".equals(tagName) && newsInfo != null) {
                        newsInfo.setTitle(parser.nextText());
                    } else if ("detail".equals(tagName) && newsInfo != null) {
                        newsInfo.setDetail(parser.nextText());
                    } else if ("comment".equals(tagName) && newsInfo != null) {
                        newsInfo.setComment(Integer.valueOf(parser.nextText()));
                    } else if ("image".equals(tagName) && newsInfo != null) {
                        newsInfo.setImageUrl(parser.nextText());
                    }
                    break;
                case XmlPullParser.END_TAG://</news>
                    if ("new".equals(tagName) && newsInfo != null) {
                        infoList.add(newsInfo);
                    }
                default:
                    break;
            }
            eventType = parser.next();//取下一个事件类型
        }

        return infoList;
    }
    /*与ListView绑定*/
    class MyAdaper extends BaseAdapter {

        @Override
        public int getCount() {
            /*litView 列表的长度等于数据的大小*/
            return list.size();
        }

        /**
         * 返回类表子条目的布局
         * @param position
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = null;
            if (convertView==null){
                LayoutInflater inflater = getLayoutInflater();
                view = inflater.inflate(R.layout.listview_item,null);
            }else {
                view = convertView;
            }
            /*重新赋值,不会产生缓存对象中原有数据保留的现象*/
            SmartImageView sivIcon = (SmartImageView) view.findViewById(R.id.siv_listvie_item_icon);
            TextView tvTitle = (TextView) view.findViewById(R.id.tv_listview_item_title);
            TextView tvDetail = (TextView) view.findViewById(R.id.tv_listview_item_detail);
            TextView tvComment = (TextView) view.findViewById(R.id.tv_listview_item_comment);
            NewsInfo newsInfo = list.get(position);

            sivIcon.setImageUrl(newsInfo.getImageUrl());
            tvTitle.setText(newsInfo.getTitle());
            tvDetail.setText(newsInfo.getDetail());
            tvComment.setText(newsInfo.getComment()+"跟帖");
            return view;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

:网络访问时不可使用localhost或者127.0.0.1,否则会抛出访问被拒绝的异常错误

在android studio中导入jar包,直接将jar包考诶到libs目录下,右键将其添加进去即可

© 著作权归作者所有

A
粉丝 5
博文 139
码字总数 106277
作品 0
广州
程序员
私信 提问
求解疑/建议:关于Android、组态软件、根据URL解析出标题/正文内容 等的问题

求解疑/建议:关于Android、组态软件、根据URL解析出标题/正文内容 等的问题 因为这关系到我能否有机会继续升读本科继续学习(我现在是专科),盼各位前辈多多指点! 简易安卓客户端新闻发布...

wkl17
2014/03/31
1K
1
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:暂无更新 mz_java后台:解决了建材店的建材商品在成交后不能增加成交量问题,修改获取抢单交易信息接口,秒装新闻功能补充 bwk后台:暂无更新 项目负责人:...

风化的骆驼
2016/12/02
3
0
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:暂无更新 mz_java后台:在秒装后台新增数据统计功能(用户统计,商家统计,VIP统计),修改秒装新闻分类 bwk后台:暂无更新 项目负责人:季景胜 up_Android...

风化的骆驼
2016/11/30
2
0
Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。 当前由于NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。...

JackJiang-
2016/06/30
876
1
迈绝伦团队工作汇总

项目负责人:余志恒 up_java后台:暂无更新 mz_java后台:图形化统计数据功能完善,修复会员期限兑换码问题 bwk后台:暂无更新 项目负责人:季景胜 up_Android:暂无更新 upzg_Android:暂无更...

风化的骆驼
2016/12/08
2
0

没有更多内容

加载失败,请刷新页面

加载更多

全面兼容IE6/IE7/IE8/FF的CSS HACK写法

浏览器市场的混乱,给设计师造成很大的麻烦,设计的页面兼容完这个浏览器还得兼容那个浏览器,本来ie6跟ff之间的兼容是很容易解决的。加上个ie7会麻烦点,ie8的出现就更头疼了,原来hack ie...

前端老手
11分钟前
3
0
常用快递电子面单批量打印api接口对接demo-JAVA示例

目前有三种方式对接电子面单: 1.快递公司:各家快递公司逐一对接接口 2.菜鸟:支持常用15家快递电子面单打印 3.快递鸟:仅对接一次,支持常用30多家主流快递电子面单打印 目前也是支持批量打...

程序的小猿
14分钟前
5
0
Yii 框架中rule规则必须搭配验证函数才能使用

public $store_id;public $user_id;public $page;public $limit;public $list;public $mch_list;public $cart_id;public $is_community;public $shop_id;public $cart_typ......

chenhongjiang
16分钟前
2
0
Flutter使用Rammus实现阿里云推送

前言: 最近新的Flutter项目有“阿里云推送通知”的需求,就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之...

EmilyWu
16分钟前
40
0
Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的: 短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短...

阿里巴巴云原生
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部