解析数据用ListView来展现

package com.org.demo.wangfeng;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import com.org.demo.wangfeng.demo.News;
import com.org.wangfeng.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
    // 下载的地址
    private String path = "";
    List<News> newsList;
    private ListView lv_main_list;
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            lv_main_list.setAdapter(new MyAdapter());
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getNewInfo();
        lv_main_list = (ListView) findViewById(R.id.lv_main_list);
        // 要保证在设置适配器时,新闻xml文件已经解析完毕
        // lv_main_list.setAdapter(new MyAdapter());
    }
/**
 * 设置lv_main_list适配器
 * @author Administrator
 *
 */
    private class MyAdapter extends BaseAdapter {
        // 得到模型曾中元素的数量,用来确定ListView需要有多少个条目
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return newsList.size();
        }

        // 返回一个View对象,作为ListView的条目显示至界面
        @Override
        public View getView(int positon, View convertView, ViewGroup parent) {
            News newss = newsList.get(positon);
            View v;
            ViewHolder myHolder;
            if (convertView == null) {
                v = View.inflate(MainActivity.this, R.layout.mainlist_item,
                        null);
                myHolder = new ViewHolder();
                // 把布局文件中所有组件的对象封装至ViewHolder对象中
                myHolder.tv_title = (TextView) v
                        .findViewById(R.id.tv_main_title);
                myHolder.tv_detail = (TextView) v
                        .findViewById(R.id.tv_main_detail);
                myHolder.tv_comment = (TextView) v
                        .findViewById(R.id.tv_main_comment);
                // 把ViewHolder对象封装至View对象中
                v.setTag(myHolder);

            } else {
                v = convertView;
                myHolder = (ViewHolder) v.getTag();
            }
            // TODO Auto-generated method stub

            // 给三个文本框设置内容
            myHolder.tv_title.setText(newss.getTitle());
            myHolder.tv_detail.setText(newss.getDetail());
            myHolder.tv_comment.setText(newss.getComment() + "条评论");

            // 给新闻图片imageview设置内容

            return v;
        }

        class ViewHolder {
            // 条目的布局文件中有什么组件,这里就定义什么组件
            TextView tv_title;
            TextView tv_detail;
            TextView tv_comment;
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

    }

    private void getNewInfo() {
        // TODO Auto-generated method stub
        Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url
                            .openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                        // 服务器返回的流
                        InputStream is = conn.getInputStream();
                        // 使用pull解析器来解析流
                        parseNewsXml(is);

                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        t.start();
    }

    /** 解析xml */
    private void parseNewsXml(InputStream is) {
        XmlPullParser xp = Xml.newPullParser();
        try {
            xp.setInput(is, "utf_8");
            // 对节点的事件类型进行判断就可以知道当期节点是什么节点
            int type = xp.getEventType();
            News news = null;

            while (type != XmlPullParser.END_DOCUMENT) {
                switch (type) {
                case XmlPullParser.START_TAG:
                    if ("newslist".equals(xp.getName())) {
                        newsList = new ArrayList<News>();
                    } else if ("news".equals(xp.getName())) {
                        news = new News();
                    } else if ("title".equals(xp.getName())) {
                        String title = xp.nextText();
                        news.setTitle(title);
                    } else if ("detail".equals(xp.getName())) {
                        String detail = xp.nextText();
                        news.setDetail(detail);
                    } else if ("comment".equals(xp.getName())) {
                        String comment = xp.nextText();
                        news.setComment(comment);
                    } else if ("imageUrl".equals(xp.getName())) {
                        String imageUrl = xp.nextText();
                        news.setImageUrl(imageUrl);
                    }
                    break;
                case XmlPullParser.END_TAG:
                    if ("news".equals(xp.getName())) {
                        newsList.add(news);
                    }
                    break;
                }

                // 解析完当期的节点后,把指针移动至下个节点,并返回它的事件类型
                type = xp.next();
            }

            for (News i : newsList) {
                System.out.println(i.toString());
            }
            // 发消息,让主线程设置ListView的适配器,如果消息不需要携带数据的话可以发送个空消息

            handler.sendEmptyMessage(1);// 数据1 表示消息发送成功的意思

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
时间: 2024-10-08 01:18:46

解析数据用ListView来展现的相关文章

(转载)Android之三种网络请求解析数据(最佳案例)

[置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的: 一:AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个

Android 下分批加载数据以及listView使用过程中的优化

需求:在开发过程中,listview加载的数据如果比较大,这时为了提高用户体验感,我们应该事先分批加载以及下拉刷新功能 1.首先,数据访问层需要提供分批加载功能的接口, 代码如下: package com.zaizai.safty.db.dao; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.

Json解析数据的简单使用

简单的记一下Json解析的简单实用: 使用场景:后台传到客户端的Json数据,类似于: string jsonObject="{'Name':'Jack','Age':25}"; string jsonArray = "[{'Name':'Jhon','Age':23},{'Name':'Jack','Age':25}]"; 客户端可以定义一个类,类中的属性对应于数据中相应的字段 class Student { public string Name { get; s

iOS 中json解析数据出现中文乱码的问题

一般服务器的编码格式都是UTF8,这样通过json解析下来的的数据,一般中文是不会出现乱码,但是如果服务器的编码格式不是UTF8,通过json解析的数据中的中文容易出现luan乱码,怎么解决这个问题呢? 一般都是通过转码来解决,但是直接转码,是不能达到效果的,例如 [jsonStringstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 这样直接转码是达不到效果的. 解析数据的时候,可以先把数据存放在NSdata对象中,

perl post函数获取网页内容及解析数据的例子

#!/usr/bin/perl -w # 程序代码只是简单说明获取解析网页内容及匹配模式使用的例子,逻辑并不是很严密use utf8;binmode(STDIN, ':encoding(utf8)');binmode(STDOUT, ':encoding(utf8)');binmode(STDERR, ':encoding(utf8)'); use LWP::UserAgent;use Encode; sub get_data{    if(@_ != 1)    {        print

一起来开发Android的天气软件(四)——使用Gson解析数据

离上一篇文章过去才4.5天,我们赶紧趁热打铁继续完毕该系列的天气软件的开发. 承接上一章的内容使用Volley实现网络的通信.返回给我们的是这一串Json数据{"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"1℃","temp2":"10℃","weat

使用接口回调解析数据并下载网络图片

package DemoBook; import mode.CookBook; public class Demobook { // 向网络回去json数据,通过接口回调 // gson解析数据 // 根据pic图片地址,下载图片存入磁盘中 // gson解析数据 public static void main(String[] args) { String path = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&l

android 解析数据之Gson

1.套路开始:先在android studio的setting中加入GsonFormat的插件 2.选好你要加载的Json数据 3.进入你需要加载的Json界面,将数据复制,并创建一个类 我这里创建的类名叫TvInfo(你可以根据实际情况取名),进入后(alt+s)GsonFormat快捷键,把你复制的数据粘贴到框内并自动生成代码即可 TvInfo package com.chuanxidemo.shaoxin.demo09; /** * Created by shaoxin on 2017/2

Json解析数据

Json数据解析(重点网址推荐:www.json.org   code.google.com/   https://www.json.com/) 1:什么是Json? 2:Json数据格式的特点? 3:使用Gson解析Json数据 (1)Json:Javascript Object Notation; JSON is a light-weight text-based open standard designed for human-readable data. It is the most w