基于sax的xml解析 含源码 UI类(二)

本节为UI部分,顺带简单的使用Thread+handler

布局类:只有两个xml文件

activity_main:主布局,仅仅只有一个listView不在给出。

item.xml使用的是相对布局,用来显示listView的各项。

<?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="20dp"
    android:gravity="center"
    >

    <TextView
        android:id="@+id/name_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/id_tv"
        android:layout_marginLeft="60dp"
        android:layout_toRightOf="@+id/id_tv"
        android:text="TextView" />

    <TextView
        android:id="@+id/age_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/name_tv"
        android:layout_alignBottom="@+id/name_tv"
        android:layout_alignParentRight="true"
        android:layout_marginRight="19dp"
        android:text="TextView" />

    <TextView
        android:id="@+id/id_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="76dp"
        android:text="TextView" />

</RelativeLayout>

主类

public class MainActivity extends Activity{

	private ListView listView=null;
	private static final String TAG="parserXML";
	private static final int MSG_SUCCESS = 1;//请求成功
	//private static final int MSG_FAILURE = 0;//获取失败的标识 

	private Handler mHandler = new Handler() {
		public void handleMessage (Message msg) {//此方法在ui线程运行

			switch (msg.what) {
			case MSG_SUCCESS:
				//获取传递过来的数据
				List<Person> list = (List<Person>) msg.obj;
				//打印
				for(Person person: list)
				{
					Log.d(TAG, person.toString());
				}

				MyAdapter adapter=new MyAdapter(list);
				adapter.notifyDataSetChanged();
				listView.setAdapter(adapter);
				break;
			default:
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView=(ListView) this.findViewById(R.id.listView1);
		doParserXML();
	}
    public class MyAdapter extends BaseAdapter
    {
        private List<Person>list;
        //传递一个list进来
        public MyAdapter(List<Person>list) {
			this.list=list;
		}
         //返回数目
		@Override
		public int getCount() {
			return list.size();
		}
        //获取position处的数据
		@Override
		public Object getItem(int position) {
			return list.get(position);
		}
        //返回item的id
		@Override
		public long getItemId(int position) {
			return position;
		}
         //返回view
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
			ViewHolder viewHolder=null;
			if(convertView==null)
			{//跟iOS的重用机制类似,且对xml的加载进行优化
				viewHolder=new ViewHolder();
				convertView=inflater.inflate(R.layout.item,null);
				viewHolder.id_tv=(TextView)convertView.findViewById(R.id.id_tv);
				viewHolder.name_tv=(TextView)convertView.findViewById(R.id.name_tv);
				viewHolder.age_tv=(TextView)convertView.findViewById(R.id.age_tv);
				//使用tag来标识
				convertView.setTag(viewHolder);

			}
			else {
				//使用tag来取出
				viewHolder=(ViewHolder) convertView.getTag();
			}
			Person person=list.get(position);
			viewHolder.id_tv.setText(person.getId()+"");
			viewHolder.age_tv.setText(person.getAge()+"");
			viewHolder.name_tv.setText(person.getName()+"");

			return convertView;
		}

    }
	protected void doParserXML() {
		new Thread(new Runnable() {

			@Override
			public void run() {

				Log.d(TAG,"开始解析XML");
				InputStream inputStream=HttpUtils.getXML();
				List<Person>list=parserXMLUtils.XMLParser(inputStream, "person");
				//使用obtainMessage(),获取一个消息
				Message message=mHandler.obtainMessage();
				message.what=MSG_SUCCESS;
				message.obj=list;
				mHandler.sendMessage(message);
			}
		}).start();

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

}

流程---》

1. 先进行数据处理:

doParserXML()

2. 将返回的数据传递给handler

3. Handler 中listView绑定adapter。

ps:adapter的使用,baseAdapter跟iOS UItableView 简直神似呀。(delegate方法和adapter的接口的含义基本上是一个意思)

list的优化也和tableView神似:单元格重用。

源码如下:

andriod 的xml解析

时间: 2024-10-08 00:44:26

基于sax的xml解析 含源码 UI类(二)的相关文章

基于sax的xml解析 含源码 各种工具类(一)

1. 服务器端很简单直接在上次的服务器端代码上的Webcontent添加itcast.xml(在网上找的一个xml) 2.客户端搭建,主要流程如下 非主线程(Thread):使用HttpURLConnection请求服务器端的xml文件流数据,返回后,使用自定义的sax解析该流数据(xml). 主线程: handler中,更新自定义adapter,最后刷新listView. 首先该xml很简单,有三个标识,id,name,age 使用一个简单的Bean进行封装. 代码如下: public cla

浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty

原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为了解析SQL脚本中的参数,根据给定的开始标记与结束标记来进行参数的定位获取,然后右标记处理器进行参数处理,再然后将处理过后的参数再组装回SQL脚本中. 如此一来,解析的目的就是为了处理参数. 这一篇看看binding绑定模块. 2.binding模块 binding模块位于org.apache.ib

史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与IXMLDOMElement接口有何联系.区别 节点如果是数组,怎么操作? 如何为属性插入属性 字符串的转换与输出 主要代码 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常

微信公众平台开发-access_token获取及应用(含源码)

微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或者禁止公众平台进行当前的操作. 一.access_token作用及使用场景 (一)access_token的作用 access_token由公众号的AppID和AppSecret组成,所以具有识别公众号的作用. (二)access_token的使用场景

Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就提出了一种把通过FILE*来访问内存的需求,下文是针对这个需求的几个方面的尝试及其结论. 以下尝试的前提是:Win7 + VS2010. 在vc中,FILE其实就是_iobuf,定义如下: struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前

17+个ASP.NET MVC扩展点,含源码{转}

1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpModule中,可以将一个方法注册到HttpApplication的任意一个事件中,在之后执行HttpApplication一些列事件时,按照事件的顺序(事件又按照添加方法先后的顺序)执行注册在事件中的方法! namespace MvcStore.Models { public class Excute

HtmlAgilityPack --解析Html源码

最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下. 1. HtmlAgilityPack使用的是XPath进行路径搜索,如果对XML路径搜索很熟悉,用起来会得心应手 <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book

C语言解析JSON源码

2020-01-09 关键字:cJSON.linux JSON解析 JSON 是一种在互联网领域内很常用的轻量级数据交换协议. 它与 XML 的地位差不多,但就笔者而言,笔者更喜欢 JSON 的风格,因为它更符合我们的思维习惯,同样一份数据,JSON 格式的就是比 XML 要清晰明了一些. 最近笔者需要在 C语言 上解析 JSON 格式,在网上一顿找,找到一份很不错的开源代码.经过一阵研究与修改以后,终于变成了让笔者用的很顺手的 C语言 版 JSON 解析器. 现将这份经笔者小小修改过的代码记录

GlusterFS源码解析 —— GlusterFS 源码安装

安装环境: CentOS6.2 glusterfs-3.4.3 GlusterFS 挂载需要 fuse 支持,如果你的内核版本低于 2.6.16 则需要下载fuse的源码包自行编译安装,也可下载 fuse 的rpm包.安装fuse的方法我就不说了,不会源码安装的直接去rpmfind.net上下载rpm即可.高于此版本的内核中已经有了fuse.ko的模块,需要的时候可以执行以下命令进行加载: modprobe -b fuse 1.下载GlusterFS的源码包,目前已经有更新版本 : wget h